自定义压缩图片格式

2024-06-08 19:48

本文主要是介绍自定义压缩图片格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    之前一篇博文是关于BMP格式的读取和存储,BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。因为不采用其他任何压缩,因此,文件所占用的空间很大。

 

    而现在普遍使用的图片格式标准有jpg,gif等,

但这些都是有损压缩,以牺牲重复或不重要的资料为代价减少占用空间。

 

    于是,我们自己可以定义一种无损压缩图片格式,从而达到无损又小巧的图片存储

 

压缩格式一:

    假如一张图片中有一种颜色范围特别多,我们可以考虑用稀疏矩阵的来存储图片每个像素点的信息

而不将每个点的信息都记录下来。如我在window自带的画图中新建了一个BMP文件,随便画了一个图形

因为默认的背景色是白色,所以文件中图像信息部分十六进制编码都是FF,假如用稀疏矩阵来存储图片像素信息。

例如:

 

我们只需要存储32*3的阵列,而不存储16*16的阵列

6300
6400
6500
108E7
109A9
.........

那么,图片占用大小就大大缩减了。

 

定义mybmp格式如下

文件头(bitmap-file header)、信息头(information header)、彩色表(color table)和用稀疏矩阵定义图像数据阵列,它具有如下所示的形式。

 

public class mybmp_Fomat{/*** file header(6 byte)* * */class FILEHEADER {short bfType;// the type of file,int bfSize;// the size of file.}/*** information header(16 byte)* */class INFOHEADER {int biWidth;// the width of bmp file.(19-22 byte)int biHeight;// the height of bmp file.(23-26 byte)int mainSum;//比例最大的一种颜色的像素数目RGBQUAD mainColor; //比例最大的一种颜色的RGB}/*** 其他颜色像素点的坐标(2 byte)* */class Point{int x;int y;}/*** color table(4 byte)*  */class RGBQUAD {byte rgbRed;// the red channelbyte rgbGreen;// the Green channelbyte rgbBlue;// the blue channelbyte rgbReserved;// reserved,value of 0 only}/*** Data Bits* */class BITMAPINFO {Point[] points;RGBQUAD[] bmiColors;}
}

     

读取图片时,先获取图片信息头和文件头,在图片的长宽范围内,先将其他

颜色的位置填充对应的颜色,在将剩余的位置填充上主要颜色,无需颜色的处理。

 

     此bpm文件属性 95*101 白色像素点7184

    原BMP文件格式大小 14 + 40 + 4 *(biWidth*biHeight)= 28.4KB

    自定义文件格式文件的大小为6 + 16 + (2+4)*(biWidth*biHeight - mainSum)= 14.48KB

这样这张图片就节省了一半的空间。

 

压缩格式二:

    还可以用一种无损压缩方式来定义压缩图片格式,文件头和信息头与BMP文件无异,只是改变图片像素颜色部分的存储编码。用的哈夫曼编码压缩BMP的图片像素颜色信息。

    读取图片就直接用哈夫曼转码还原图片信息。这样就可以达到图片无损压缩的要求了。

 

 

这篇关于自定义压缩图片格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043138

相关文章

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N