自定义压缩图片格式

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

 

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

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

 

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

 

压缩格式一:

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

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

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

例如:
自定义压缩图片格式_第1张图片
 

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

6 3 00
6 4 00
6 5 00
10 8 E7
10 9 A9
... ... ...

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

 

定义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 channel
		byte rgbGreen;// the Green channel
		byte rgbBlue;// the blue channel
		byte 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的图片像素颜色信息。

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

 

 

你可能感兴趣的:(压缩,图片,文件,bmp,稀疏矩阵)