8位位图转换成24位位图

转载 2015年07月09日 15:28:25

8位位图与24位位图的区别就在于8位的有调色板,而24位的没有。调色板信息是按(BGRA)顺序存放的,每4位是一个调色板项,共有256个调色板,故只能显示256种颜色,其中A始终为0。位图数据区则是存储的调色板索引,比如0,1,2……按索引获取颜色。

24位的则不然,24位位图没有调色板,数据区存储的就是BGR颜色数据,每3位为一个像素点的颜色,所以可以显示2的24次方种颜色。

转换过程很容易,就是按照8位位图索引取出调色板中的数据,把A舍去,把其他的按顺序存储到24位图像的数据区,在数据区前加上位图的头就OK了,代码如下:

void CDib::ConverTo24Bit()
{
 LPBITMAPINFOHEADER  lpbi;
 if(!hdib)
  return;
 lpbi = (BITMAPINFOHEADER*)hdib;//hdib是成员变量,指向已打开的位图信息首地址
 int height = lpbi->biHeight;
 //两个宽度
 LONG lLineBytes24=((lpbi->biWidth*24+31)/32*4);
 LONG lLineBytes8=((lpbi->biWidth*8+31)/32*4);
 //源图像的指针,申请一块足够大的内存
 BYTE* srcBits ;//= (BYTE*)malloc(lLineBytes8*height);
 //使其指向源图像的图像数据起始地址
 srcBits = (BYTE*)lpbi+sizeof(BITMAPINFOHEADER)+PaletteSize();
 //转换后的图像数据指针
 BYTE* dstBits = (BYTE*)malloc(lLineBytes24*height);
 //调色板信息
 RGBQUAD *pRgb = (RGBQUAD *)((BYTE*)lpbi+sizeof(BITMAPINFOHEADER));
 //通过循环,使8位BMP中的颜色信息转换为24位
 //因为24位是用三位表示一个颜色(顺序是BGR),没有调色板,而8位的是一位表示一个颜色信息在调色板中的偏移量
 for( int i=0; i<height; i++)
 {
  for(int j=0, n=0; j<lLineBytes8; j++)
  {
   int num = *(srcBits+lLineBytes8*i+j);//获取8位中调色板信息的偏移量
   //将颜色信息写入24位指针指向的地址(为了保证dstBits始终指向首地址,故不写成dst=...)
   *(dstBits+lLineBytes24*i+n)=pRgb[num].rgbBlue;
   n++;
   *(dstBits+lLineBytes24*i+n)=pRgb[num].rgbGreen;
   n++;
   *(dstBits+lLineBytes24*i+n)=pRgb[num].rgbRed;
   n++;
  }
 }
 //24位BMP的信息头
 BITMAPINFOHEADER bi;
 bi.biBitCount=24;
 bi.biClrImportant=0;
 bi.biClrUsed=0;
 bi.biCompression=0L;
 bi.biHeight=Height();
 bi.biPlanes=1;
 bi.biSize=sizeof(BITMAPINFOHEADER);
 bi.biSizeImage=Height()*lLineBytes24;
 bi.biWidth=Width();
 bi.biXPelsPerMeter=0;
 bi.biYPelsPerMeter=0;
 //设置BMP信息头和数据信息函数
 SetBitmapinfoAndBits(bi, dstBits);//函数功能为把信息头和数据信息合并,存储在hdib指针指向的区域内
 CString FileName;
 strFileName.Delete(strFileName.GetLength()-4, 4);
 FileName.Format("%s的24位图.bmp",strFileName);
 SaveFile(FileName);//把hdib指向的区域写入到文件
 //收尾清除指针内存
 //free(srcBits);
 srcBits = NULL;
 free(dstBits);
 dstBits = NULL;
 AfxMessageBox("已经转换成24位,另存为:"+FileName);
}

 

关于读取和设置信息头,保存部分会写在别的地方

相关文章推荐

24位真彩色转换为8位灰度图片(完整代码)

图像的灰度与二值化 http://www.cnblogs.com/maozefa/archive/2011/12/09/2281656.html     图像的灰度化与二值化是图像处理中最常见...
  • ljsant
  • ljsant
  • 2017年03月24日 08:44
  • 731

实现1位,4位,8位,24位BMP位图的互相转换的方法,32位转24位

from: http://blog.sina.com.cn/s/blog_61e61df60100igzb.html BOOL SaveTrueBmp(HBITMAP hBitmap, CString...

8位位图转换为24位位图

8位位图转换为24位位图 其实,只要从8位位图中取得一个像素的灰度值,然后去填充24位位图的三个字节就可以了,很明显,这样得到的24位位图是灰度的,就是RGB各分量是一样的值。 主要的转换...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

32位位图与24位位图互相转换

1、32位图数据转换成24位位图数据: unsigned char* RGB32TO24(unsigned char* src, int width, int height) { uint8_t*...
  • MikeDai
  • MikeDai
  • 2017年03月13日 11:45
  • 693

位图(Bitmap)16色,256色,24位位图表达的意思

 我们常说:Windows95/98处于16色或256色状态,它的意思是屏幕上最多能显示多少种颜色。   你看,在16色下显示黑白的文本或简单的色彩线条是非常正常的,但如果我们要想看多于16种颜色的画...
  • gwwgle
  • gwwgle
  • 2009年11月26日 16:42
  • 9103

将24位位图转换8位位图

bmpTest.h   :介绍BMP文件的格式及结构定义 bmpTest.cpp : 24bitBMP颜色数据到256色位图颜色数据的转换函数实现,具体算法可参考以 前的一个帖子 bmpTrans...

8位位图和24位位图的相互转换

8位位图转换为24位位图其实,只要从8位位图中取得一个像素的灰度值,然后去填充24位位图的三个字节就可以了,很明显,这样得到的24位位图是灰度的,就是RGB各分量是一样的值。主要的转换程序/*****...
  • poonjun
  • poonjun
  • 2009年01月04日 09:58
  • 7423

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:8位位图转换成24位位图
举报原因:
原因补充:

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