自定义压缩图片格式

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

相关文章

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

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

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3