之前一篇博文是关于BMP格式的读取和存储,BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。因为不采用其他任何压缩,因此,文件所占用的空间很大。
而现在普遍使用的图片格式标准有jpg,gif等,
但这些都是有损压缩,以牺牲重复或不重要的资料为代价减少占用空间。
于是,我们自己可以定义一种无损压缩图片格式,从而达到无损又小巧的图片存储
压缩格式一:
假如一张图片中有一种颜色范围特别多,我们可以考虑用稀疏矩阵的来存储图片每个像素点的信息
而不将每个点的信息都记录下来。如我在window自带的画图中新建了一个BMP文件,随便画了一个图形
因为默认的背景色是白色,所以文件中图像信息部分十六进制编码都是FF,假如用稀疏矩阵来存储图片像素信息。
例如:
我们只需要存储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的图片像素颜色信息。
读取图片就直接用哈夫曼转码还原图片信息。这样就可以达到图片无损压缩的要求了。