python读取bmp文件,python json文件处理
最近想做一个图片查看者,因为bmp图片很简单,所以现在就开始。
“协议”的理解很重要,无论是基础知识还是IO的知识。
我以前觉得这些协议很酷。感觉像是密码。只有读取文件,知道对方的“加密”方法,才能正确解密。不然拿着也没用。为了在记事本中正确打开图像,内容只是乱码。
反正根据上面的说明,我们首先要知道的是如何编写BMP文件。
BMP文件分为四个部分:文件头信息块、图像描述信息块、颜色表和图像信息区。
文件头信息块
这部分主要是一些基本信息,比如前2个字节最后读为BM来识别BMP文件,所以以后你想读取和分类各种类型的文件时可以通过开头的标识符来分类。
这部分信息对后面读图没有意义,直接读,跳过。
Java代码
//读取前14个字节
intbflen=14
bytebf[]=new byte[bflen];
dis . read(BF;
//读取前14个字节
int bflen=14
byte BF[]=新字节[bflen];
dis . read(BF;
图像描述信息块
此部分包含图像的基本信息,包括其大小、宽度、高度和压缩方法。
宽度和高度是非常重要的数据,所以在这里得到宽度和高度。
Java代码
//读取最后40个字节以获得图像的宽度和高度
intbilen=40
byte bi[]=new byte[bilen];
dis.read(bi,0,bilen);
image_width=changeint(bi,7);
image_height=changeint(bi,11);
//读取最后40个字节以获得图像的宽度和高度
int bilen=40
byte bi[]=新字节[bilen];
dis.read(bi,0,bilen);
image_width=changeint(bi,7);
image_height=changeint(bi,11);
Java代码
//*
*如何将*byte转换成int数据
从*@parambi传递的数组
*@paramend最后一个字节类型
* @返回
*/
publicintchangeint(byte[]bi,intended){
return () (int ) bi[end]0xff ) 24))))).
() (int ) bi[end-1]0xff ) 16)).
() (int ) bi[end-2]0xff )8))).
(int)bi[end-3]0x ff;
}
//*
*如何将* byte转换成int数据
从* @param bi传递的数组
* @param end最后一个字节类型
* @返回
*/
publicintchangeint(byte[]bi,int end ) {
return () (int ) bi[end]0xff ) 24))))).
() (int ) bi[end-1]0xff ) 16)).
() (int ) bi[end-2]0xff )8))).
(int)bi[end-3]0x ff;
}
彩色桌子
这个区域的大小随颜色模式的不同而不同,很少用于后面的阅读,这里就不知道了。
图像数据区
BMP格式的图像分为双色图像、16色图像、256色图像和纯色图像。
除了真彩色,其他三种格式都必须用00把一行的字节数补充到4的整数倍。
所以在处理图像的时候要注意这个问题,跳过用来补偿4个整数倍的数据。
Java代码
//*
*如何显示颜色
*颜色处理
*@paramdis数据流
*/
public void show RGB 24(data inputstreamdis){
如果(!(image_width*3%4==0) {
skip _ width=4-image _ width * 3% 4;
}
//申请排列空间
imageg=new int [图像高度] [图像宽度];
imageb=new int [图像高度] [图像宽度];
imager=new int [图像高度] [图像宽度];
for(inth=image _ height-1;h=0;h - ) {
for(intw=0;w
尝试{
int blue=dis . read(;
int green=dis . read(;
intred=dis . read(;
imageB[h][w]=蓝色;
imageG[h][w]=绿色;
成像仪[h][w]=红色;
}catch(ioexceptione ) {
E.打印作业跟踪(;
system . exit(0;
}
if(w==0) {
尝试{
system . out . println(dis . skip bytes)skip _ width);
}catch(ioexceptione ) {
E.打印作业跟踪(;
}
}
}
}
}
//*
*如何显示颜色
*颜色处理
* @param dis数据流
*/
public void show RGB 24(data inputstreamdis){
如果(!(image_width*3%4==0) {
skip _ width=4-image _ width * 3% 4;
}
//申请排列空间
imageg=new int [图像高度] [图像宽度];
imageb=new int [图像高度] [图像宽度];
imager=new int [图像高度] [图像宽度];
for(inth=image _ height-1;h=0;h - ) {
for(intw=0;w
尝试{
int blue=dis . read(;
int green=dis . read(;
int red=dis . read(;
imageB[h][w]=蓝色;
imageG[h][w]=绿色;
成像仪[h][w]=红色;
}catch(ioexceptione ) {
E.打印作业跟踪(;
system . exit(0;
}
if(w==0) {
尝试{
system . out . println(dis . skip bytes)skip _ width);
}catch(ioexceptione ) {
E.打印作业跟踪(;
}
}
}
}
}
保存颜色后,您可以稍后重新绘制图像。
总结:
包括即将开展的通信项目,我个人认为重要的还是协议。不是一种看起来很好的状态,而是一种包括特殊情况在内的深刻理解的状态。还是透过现象看本质吧~
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。