Qt 与 图片解析 ppm图片bmp图片格式

最近用qt编写两个小程序,一个是解析ppm格式的图片,一个是将ppm格式的图片转存为bmp格式图片

首先要明确ppm和bmp格式图片的头

ppm:头部分由三部分组成,这三部分由回车或换行分割,但PPM的标准中是要求空格。

         第一行通常是P3或P6,说明是PPM格式;

         第二行是图象的宽度和高度,用ASCII来表示;

         最后一部分是描述像素的最大颜色组成,这里允许描述超过一个字节(0-255)的颜色值。

         另外可以在上面个部分的后面用#来追加注释,注释行是从#到该行末

            例:P6

               1024 778

               255

           头部分的后面为图像数据部分,像素点的(R、G、B)的排列。

bmp:

位图文件主要分为如下3个部分:

块名称

大小(Byte

文件信息头

14

位图信息头

40

RGB颜色阵列

由图像长宽尺寸决定

文件信息头:

bfType

说明文件的类型,该值必需是0x4D42,也就是字符'BM'。

                            2byte

bfSize

说明该位图文件的大小,用字节为单位


4byte

bfReserved1

保留,必须设置为0


2byte

bfReserved2

保留,必须设置为0


2byte

bfOffBits

说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。


4byte

位图信息头:

biSize

说明BITMAPINFOHEADER结构所需要的字数。

                                
4byte

biWidth

说明图象的宽度,以象素为单位。


4byte

biHeight

说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。



4byte

biPlanes

为目标设备说明位面数,其值将总是被设为1。

2byte

biBitCount

说明比特数/象素,其值为1、4、8、16、24、或32。但是由于我们平时用到的图像绝大部分是24位和32位的,所以我们讨论这两类图像。


2byte

biCompression

说明图象数据压缩的类型,同样我们只讨论没有压缩的类型:BI_RGB。


4byte

biSizeImage

说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0。


4byte

biXPelsPerMeter

说明水平分辨率,用象素/米表示。


4byte

biYPelsPerMeter

说明垂直分辨率,用象素/米表示。


4byte

biClrUsed

说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。


4byte

biClrImportant

说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。


4byte

注:1、RGB颜色阵列的存储,实际存储的为B、G、R顺序;2、图片宽 X每个像素的字节数!= 4的整数倍时要在每行的后面补上缺少的字节,以0填充;3、图片存储的第一行颜色序列为实为最后一行,所以按从小到大的顺序读像素点,那么得到的图像会是倒着的。

编写程序中的遇到的小问题:

ppm像素点的读取问题,两种方式读:1、一行为RGB三个值,一次读取一行,file.readLine(data,255);line = tr(data);pos[index] = line.toInt();    以此取得每一个像素点,存在pos数组中, unsigned int r = pos[f];img->setPixel(j,i,qRgb(r,g,b)) ;  i,j为屏幕位置。2、ppm文件以char*形式读出,file.read((char*)d,count);unsigned int r = (unsigned int )(d[pos]);img->setPixel(i,j,qRgb(r,g,b));


bmp图片文件存储问题:文件信息头与位图信息头的存储格式:我首先使用的是int16_t代表2byte,但不能实现图片正常显示,保存出的图片头信息错误。后改为uchar,无符号,2byte的定义,例:uchar bfType[2];下标0为低位,1为高位。利用memcpy和memset进行赋值。

在将图片保存为bmp格式的时候,像素点的设置行的循环要从最大开始循环到0,for(int i = height;i>0;i++) ,我程序中的height为高,控制行。 


主要明确了两个图片的格式,练习了Qt。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值