BMP真彩色转256色

转载 2015年07月07日 10:48:40

原文链接:http://pyhcx.blog.51cto.com/713166/144126/


1.     位图格式
  位图文件主要分为4个部分组成:文件头,信息头,调色板,图像数据。

1.)
文件头
  
结构定义如下:
   typedef struct tagBITMAPFILEHEADER
   {
       WORD   bfType ;         //
文件类型,必须为 BM .

       DWORD  bfSize ;         //
整个文件的字节大小

       WORD   bfReserved1 ;    //
保留,为0

       WORD   bfReserved2 ;    //
保留,为0

       DWORD  bfOffBits ;      //
图像数据在文件中相对头结构的偏移字节数.

   }BITMAPFILEHEADER ;
2.)
信息头 ;

  
结构定义如下:
   typedef struct tagBITMAPINFOHEADER
   {
       DWORD biSize;            //
结构大小

       LONG biWidth;            //
图像宽度(像素)

       LONG biHeight;           //
图像高度(像素)

       WORD biPlanes;           //
图象位平面数目,必须为1

       WORD biBitCount         //
每像素的位数(14824

       DWORD biCompression;    //
压缩类型

       DWORD biSizeImage;      //
压缩图象大小的字节值

       LONG biXPelsPerMeter;    //
水平分辨率

       LONG biYPelsPerMeter;    //
垂直分辨率

       DWORD biClrUsed;        //
使用的颜色数目

       DWORD biClrImportant;    //
重要颜色数目

   } BITMAPINFOHEADER;
3.)
调色板

  
每个调色板元素的结构体定义如下:
   typedef struct tagRGBQUAD
   {
       BYTE rgbBlue;
       BYTE rgbGreen;
       BYTE rgbRed;
       BYTE rgbReserved;
   } RGBQUAD;
  
对于高位位图,将没有调色板存在.

4.)
图像数据

  
包含实际的图像数据,N位位图,每N Bits表示一个像素的值,按从下到上行优先存储,同时每行按4字节对齐.
5.)
读取位图文件

  
打开文件 :
       FILE * fBmp = _tfopen(fileName,_T("rb"));
  
读取文件头:

       BITMAPFILEHEADER FileHeader;
       fread(&FileHeader,sizeof(BITMAPFILEHEADER),1,fBmp);
  
读取信息头:

       BITMAPINFOHEADER InfoHeader;
       fread(&InfoHeader,sizeof(BITMAPINFOHEADER),1,fBmp);
  
读取调色板(256色为例,调色板有256)

       RGBQUAD quard[256] ;
       fread(quard,sizeof(RGBQUARD),256,fBmp);
  
读取图像数据:

       int nDataLen = (((InfoHeader.biWidth*InfoHeader.biBitCount/8) + 3)
/ 4) * 4 * InfoHeader.biHeight ;
       BYTE * pbyDataBuf = new BYTE[ nDataLen ] ;
       fseek(fBmp,FileHeader.bfOffBits,SEEK_SET);
       fread(pbyDataBuf ,nDataLen ,1,fBmp);

2.
八叉树算法

  
使用八叉树算法实现真彩色(24Bits)256.要实现此功能,主要就是从真彩色中查找出最能代表整张图像的256种颜色,建立调色板.八叉树就是为了找出这256种颜色.
1.)
建立八叉树

  
八叉树节点的特性就是每个节点最多有8个字节点,编号为0~7 .
    以RGB值建立八叉树,首先建立根节点(Root),然后分别以RGB的每一位分别组成一个0~7的值,依次插入树中。以RGB(123,54,78)为例,
 
    以此类推,将所有的RGB值逐层插入到八叉树中,在每个节点上,记录所有经过的节点的RGB值的总和,已及RGB颜色个数。八叉树节点结构如下:
   typedef struct tagNode
   {
       DWORD  dwCounter ;      //
经过该节点的个数

       DWORD  dwRedSum ;     //  R
分量的总和

       DWORD  dwGreenSum ;    // G
分量的总和

       DWORD  dwBlueSum ;     // B
分量的总和

       BOOL    bLeafNode ;      //
是否为叶子节点.

       tagNode *  psChild[8];      //
分别指向该节点编号为0~78个子节点.

   }SNode ;
  
插入的过程中,如果节点不存在,则需要创建新的节点,然后增加节点计数以及RGB各分量的总和.当在插入时,发现节点已经存在,且是叶子节点,则停止该颜色后续层数节点的插入。插入完一个颜色之后,如果叶子节点数超过了我们要得到的颜色数(256色需要得到256种颜色),这时候就需要合并一些呀字节点了,使的叶子节点的个数不超过我们要得到的颜色数。

  
由于越底层的节点,数据的敏感度越低,所以,我们将从最底层的节点开始合并。按节点计数值小的优先合并策略,将其字节点的所有RGB分量以及节点计数全部记录到该节点中,并删除其所有子节点。依此进行,直到合并后的叶子数符合要求为止。

2.)
提取调色板

  
按照上述的步骤插入完所有的颜色之后,便建立起一颗叶子节点不超过256的八叉树。此时,取出叶子节点中的RGB分量的平均值(分量总和 / 节点计数),即是得到的调色板颜色值。
3.)
匹配调色板索引

  
所谓匹配调色板索引,就是根据原始的RGB值,在调色板中查找出最接近的颜色的索引。对每个RGB颜色,分别对调色板数据求各分量的差值的平方和,求的的最小值对应的调色板颜色的索引,即是该RGB颜色匹配到的调色板索引


用于将真彩色图像降级为索引图像的八叉树算法

用于将真彩色图像降级为索引图像的八叉树算法    本文介绍的内容,是用八叉树法降级一个真彩色图像(BPP=16以上)。这也是某公司在今年校园招聘中的笔试中的最后一道题目。我参考了 Jeff Prosi...
  • Augusdi
  • Augusdi
  • 2014年07月01日 10:42
  • 1945

BMP图像的处理(24位转16位)

bmp图像的简单转换
  • Frankgoogle
  • Frankgoogle
  • 2016年07月17日 00:31
  • 2006

MFC下256色BMP位图的保存

一、BMP位图的文件格式 BMP文件的数据按照从文件头开始的先后顺序分为四个部分: ◆ 位图文件头(bmp file header):  提供文件的格式、大小等信息 ◆ 位图信息头(bitmap...
  • qq_22531295
  • qq_22531295
  • 2017年02月22日 15:00
  • 441

BMP--24位真彩色转换为灰度图像

以下文本内容来自http://zhidao.baidu.com/question/152910968.html中的部分内容 把RGB值转换为灰度值的公式: Gray   :=   Trunc(0....
  • CSDNwei
  • CSDNwei
  • 2015年08月31日 18:19
  • 1524

C/C++ BMP(24位真彩色)图像处理(1)------图像の打开与数据区处理

在图像处理过程中,通常以MATLAB代码进行模拟,
  • oHanTanYanYing
  • oHanTanYanYing
  • 2014年04月20日 17:44
  • 3759

C/C++ BMP(24位真彩色)图像处理(4)------图像の旋转

历经一个多月,CSDN貌似终于好像把文章列表阅读量信息归零BUG给修好了,于是乎放篇做期末大作业时写的文章上来测测效果,可别又像上次一样一发文章就又坑爹了啊! 本篇谈的是图像的旋转,不算是什么新鲜的题...
  • oHanTanYanYing
  • oHanTanYanYing
  • 2014年09月21日 01:18
  • 3667

将24位真彩色图转换为8位灰度图片

/** * 程序名: Convert.cpp * 功  能: 将24位真彩色图转换为8位灰度图片 *  测试图片test1.bmp放到工程目录下 */ #include #include...
  • u013146742
  • u013146742
  • 2016年04月05日 20:38
  • 293

BMP图片格式详细解析--以256色为例还原256色BMP图像数据

256色bmp图像还原记录: 通过分析bmp图片的格式,可以完成BMP图片的打开和保存 一、bmp格式: 典型的 BMP 图像文件由四部分组成: 1 . 位图文件头数据结构 ,它包含 BMP...
  • cnzaicom
  • cnzaicom
  • 2016年04月28日 21:51
  • 1302

通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)

参考http://hi.baidu.com/mingxin505/item/52d6d1cda805d925a0b50a57,将其改为linux下可编译运行。可实现YUV420P与RGB32的互转。 ...
  • flyfight88
  • flyfight88
  • 2013年01月25日 15:14
  • 6058

数字图像处理之24位真彩色转256色调色边图

真彩图即RGB图0 0转256色调色板图据我查得,常用的算法有     1)流行色算法:     对图像中所有像素点的RGB值进行统计,找出出现次数最多的256种颜色作为调色板的颜色。然后将原图中的各...
  • Geng19930909
  • Geng19930909
  • 2013年12月24日 00:15
  • 1356
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BMP真彩色转256色
举报原因:
原因补充:

(最多只允许输入30个字)