LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 652|回复: 5

象素的转换

[复制链接]
发表于 2004-12-7 14:13:44 | 显示全部楼层 |阅读模式
大家都知道任何一种格式的图形文件的每个象素都用诸如1,4,8,16,24等更高的bits来表示,每一种颜色都由r,g,b混合而成,那么任何一个8bits的pixel是由比如说8bits的R,G,B相与还是相或还是异或呢?想将一副图形文件如bmp,jpeg(每种图形文件的数据结构是不同的)的各个象素的rgb二进制分量提到数组中,该如何做?
 楼主| 发表于 2004-12-7 16:37:40 | 显示全部楼层
每种文件有不同的组成的数据结构,对于bmp文件来说,他有四个部分组成:位图文件头(bitmap-file header),位图信息头(bitmap-information header),彩色表(color table),图象数据阵列字节
。那么当我用c的fopen()打开一个.bmp文件时,如何通过他的数据结构读取必要的信息,如每个象素的bit位,文件的压缩方式,等。比如说他的文件大小为100kb那么除去前面各个文件信息假如是10kb,那最后的90kb是数据是由象素采取的bit位所决定的,因为对于16,24,32bits的象素没有调色板,而直接用bits位表示RGB,相比之下1,4,8bits通过索引调用调色板的来实现象素的颜色!
发表于 2004-12-7 16:58:18 | 显示全部楼层
去找本计算机图像编程的书,肯定可以得到你所需要的。
 楼主| 发表于 2004-12-7 20:41:37 | 显示全部楼层
bmp位图的前54个字节是存放信息的,后面的内容是图形象素的数据区,这里的数据区是指各个象素的RGB值或索引的彩色表。准备这么做
1:
用fopen()先打开一个bmp文件。
2:
用fread()将前面的54个字节的重要信息读出来,判断象素是多少bit位,因为1,4,8的bit位的象素,在54字节后的数据RGB内容与16,24,32bits的内容不一样。
3:
分别定义8,24,32bits读取54字节后的内容的函数,根据判断的bits转到相应的函数。
4:
求出数据区的大小   n=用文件总大小-54字节。对于24bits的象素,先定义pixel[n]数组。每个pixel[0...n-1]中在嵌套三个数组:
R[8],G[8],B[8],将用于存放每个象素的RGB值。而对于8,32的象素我还未想清楚,因为他们的数据存放不一样的。不只各位高手有何高解!
发表于 2004-12-8 08:41:24 | 显示全部楼层
如果目的是编出实用的程序,建议直接引用一些现成的库,比如
gdk-pixbuf,  jpeglib
 楼主| 发表于 2004-12-8 17:17:08 | 显示全部楼层
对于24bits的BMP象素,现在在才确定一个10kb大小的BMP除去前54byte,后面的全是位图数据:即每个象素的RGB值,分别占用3个字节,不像1,4,8,16,32的bits位复杂。我是通过程序证实的。
那么现在我将指针定到第一个象素的RGB地址上,然后将每三个连续的字节分别读到我的Pixel[*bi_width][*bi_height]中,这里由问题吗?
rewind(fp1);
fseek(fp1,54L,1);
for(i=0;i<*bi_Width;i++)
        {
                for(j=0;j<*bi_Height;j++)
                {
                fread(&ixel_Array[j].R_Data,sizeof(char),1,fp1);
                fread(&ixel_Array[j].G_Data,sizeof(char),1,fp1);
                fread(&ixel_Array[j].B_Data,sizeof(char),1,fp1);
                }
        }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表