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);
}

 

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

8位位图转换为24位位图

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

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

from: http://blog.sina.com.cn/s/blog_61e61df60100igzb.html BOOL SaveTrueBmp(HBITMAP hBitmap, CString...
  • lys07962000
  • lys07962000
  • 2015年05月09日 17:59
  • 11979

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

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

C# 24位彩图转8位灰度图

将24位的彩色图片转化为8位的灰度图片 C#写的。 using System; using System.Collections.Generic; using System....
  • Isaac320
  • Isaac320
  • 2017年04月01日 14:23
  • 1033

将24位位图转换8位位图

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

把8bit位图转换位24位图的图片

最近写了一个把8bit位图转换位24位位图图片的程序.当初写时在网上搜索资料没有找到,并且发现很多人在询问,所以就把代码放于此,供大家参考! //下面是头文件 :8bto24b.h./**//*---...
  • ly611919
  • ly611919
  • 2007年07月26日 08:54
  • 1964

MFC数字图像处理24位图转8位图 等四种图像色彩转换方式

一、 实验主要思路和基本操作 本实验主要探究8位图和24位图的颜色转换。8位图具有调色板,调色板中有对应的256种不同的颜色,每种颜色所含的RGB值都不一样。24位图没有调色板,RGB三个颜色分量...
  • qq_36120652
  • qq_36120652
  • 2016年10月25日 11:08
  • 407

位图转换程序(16位bmp到8位bmp,16位bmp到24位bmp)

  • 2010年01月11日 17:46
  • 15KB
  • 下载

实现BMP位图色深转换的方法

由于最近要写地图分色的小程序,所以研究了一下位图的结构.也从网上收罗了一些相关的文章,但是关于位图格式转换的文章不多,要么就是太繁琐。     有没有一种简单的方法实现1位,4位,8位,24位B...
  • xiaoxiaomao410
  • xiaoxiaomao410
  • 2014年02月17日 19:04
  • 966

MFC edit控件实现自动换行

必须设置Vertical Scrollbar = TRUE 必须设置MultiLine = TRUE 必须设置Horizontal Scrollbar = FALSE 必须设置Auto HScr...
  • a200638012
  • a200638012
  • 2016年07月08日 17:22
  • 4781
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:8位位图转换成24位位图
举报原因:
原因补充:

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