BMP的8位位图转换24位位图

原创 2015年07月09日 15:24:50

#define WIDTHBYTES(bits) (((bits)+31)/32*4)  //一行的位数
/******************************************************************************
*函数功能:获取位图信息
*函数声明:
   BOOL GetNormalBmpInfo(
   CString m_strFile,  -位图路径
   nWidth,  -位图宽度
   nHeight:位图高度
   biBitCount:位数
   pbi,获取位图地址
   lpBits:获取位图的实际数据
    )
******************************************************************************/
bool GetNormalBmpInfo(CString m_strFile,int &nWidth,int &nHeight, int &iBitCount,BITMAPINFO**pbi,void** lpBits)// 获取标准BMP文件的长度和高度
{
CFile file;
if( !file.Open( m_strFile, CFile::modeRead) )
return false;
BITMAPFILEHEADER bmfHeader;
//读位图文件头信息
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
return false;
//判断是否是BMP
if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B'))
return false;
//读位图头信息
BITMAPINFOHEADER bmiHeader;
if (file.Read((LPSTR)&bmiHeader, sizeof(bmiHeader)) !=sizeof(bmiHeader))
return false;
//获得大小信息,并显示
nWidth = bmiHeader.biWidth;
nHeight = bmiHeader.biHeight;
iBitCount = bmiHeader.biBitCount;
int numQuad = 0;
if(bmiHeader.biBitCount < 24)////小于24位有调色板
{
numQuad = 1 << bmiHeader.biBitCount;
//为图像信息pbi申请空间
//* pbi=(BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
* pbi=(BITMAPINFO*)new BYTE[sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD)];
memcpy(*pbi,&bmiHeader,sizeof(bmiHeader));
RGBQUAD* quad =(RGBQUAD*)((BYTE*)(*pbi)+sizeof(BITMAPINFOHEADER));
//读取调色板
if(numQuad!=0)
{
file.Read(quad,sizeof(RGBQUAD)*numQuad);
}
}
DWORD fileLength =  bmiHeader.biWidth* bmiHeader.biHeight;//总文件大小
DWORD  size = fileLength -sizeof(BITMAPFILEHEADER);//文件大小-文件头结构体的大小,此时你会发现,文件头的大小的确是14字节
bmiHeader.biSizeImage = file.GetLength() - bmfHeader.bfOffBits;
//int l_width = WIDTHBYTES( bmiHeader.biWidth* bmiHeader.biBitCount);//计算位图的实际宽度并确保它为32的倍数
//long nSize = l_width*bmiHeader.biHeight;
*lpBits = (BYTE*)new BYTE[bmiHeader.biSizeImage];
file.Read((void*)(*lpBits), bmiHeader.biSizeImage);//通过读取,把读出的数据存入刚才分配的内存之中
file.Close();//文件操作完成之后关闭文件
return true;
}

/******************************************************************************

*函数功能:将8位位图转换为24位位图
*函数声明:
   BOOL Bitmap8To24(
    BYTE* srcImage,  -指向源图像的像素数据的指针
    BYTE* dstImage,  -指向目的图像的像素数据的指针
BITMAPINFO* lpbi,=位图信息地址
    LONG imageWidth, -源图像的宽度(像素数)
    LONG imageHeight -源图像的高度(像素数)
    )
******************************************************************************/
BOOL CDIB::Bitmap8To24(BYTE* srcImage,BYTE* dstImage,BITMAPINFO* lpbi,LONG imageWidth,LONG imageHeight)
{
LONG lLineBytes24=((imageWidth*24+31)/32*4);
LONG lLineBytes8=((imageWidth*8+31)/32*4);
int n,j;
/*for(int i=0;i<imageHeight;i++)
{
for(j=0,n=0;j<lLineBytes8;j++,n++)//这部分为转换成灰度图像
{
BYTE gray=*(srcImage+lLineBytes8*i+j);
*(dstImage+lLineBytes24*i+n)=gray;
n++;
*(dstImage+lLineBytes24*i+n)=gray;
n++;
*(dstImage+lLineBytes24*i+n)=gray;
}
}*/


//因为24位是用三位表示一个颜色(顺序是BGR),没有调色板,而8位的是一位表示一个颜色信息在调色板中的偏移量
RGBQUAD *pRgb = (RGBQUAD *)((BYTE*)lpbi+sizeof(BITMAPINFOHEADER));
for( int i=0; i<imageHeight; i++)
{
for( j=0, n=0; j<lLineBytes8; j++)
{
int num = *(srcImage+lLineBytes8*i+j);//获取8位中调色板信息的偏移量
//将颜色信息写入24位指针指向的地址(为了保证dstBits始终指向首地址,故不写成dst=...)
*(dstImage+lLineBytes24*i+n)=pRgb[num].rgbBlue;
n++;
*(dstImage+lLineBytes24*i+n)=pRgb[num].rgbGreen;
n++;
*(dstImage+lLineBytes24*i+n)=pRgb[num].rgbRed;
n++;
}
}
return true;

}

注意:上面两个函数已经根据8位图信息转为24位实际数据,接下来可以自己加入24位头部信息生成图像。

参考地址:http://blog.csdn.net/poonjun/article/details/3701641

http://blog.csdn.net/yjn43422757/article/details/6493658

http://blog.csdn.net/yjn43422757/article/details/6493662


8位位图转换成24位位图

8位位图与24位位图的区别就在于8位的有调色板,而24位的没有。调色板信息是按(BGRA)顺序存放的,每4位是一个调色板项,共有256个调色板,故只能显示256种颜色,其中A始终为0。位图数据区则是存...
  • shejiannan
  • shejiannan
  • 2015年07月09日 15:28
  • 1337

实现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
  • 11583

使用C++读取8位BMP位图

使用C++读取8位BMP位图一、 基础知识 微软的图像库关于位图的数据结构BITMAPFILEHEADER、BITMAPINFOHEADER 位图存储时候的四字节对齐。 调色板的理解 二、八位图片的读...
  • yesejiangnan
  • yesejiangnan
  • 2015年05月26日 10:58
  • 2663

24位位图转8位灰度图

bool ImageReader::depthfrom24to8(char *newimageName) { //以二进制写的方式打开文件 FILE *fp=fopen(newimageName,"...
  • u014568921
  • u014568921
  • 2015年09月11日 14:15
  • 1752

24位真色位图转化为8位灰度位图

位图文件(bitmap file)保存顺序如下: 位图头文件(BITMAPFILEHEADER) 位图信息头文件(BITMAPINFOHEADER) ...
  • nodeman
  • nodeman
  • 2014年12月26日 14:47
  • 344

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

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

BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的

16位,24位,32位的BMP图片算法是如何运算的 这段代码的作用是将缓冲区里的24位、16位、32位的数据转换成RGB565格式的16位颜色值。 if(color_byte == 3...
  • qq445803843
  • qq445803843
  • 2015年06月12日 23:06
  • 2813

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

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

BMP位图结构很详细的说明和…

原文地址:BMP位图结构很详细的说明和示例作者:立志转自:http://www.madio.net/tool/thread-1995-1-1.html 一、文件格式 Bmp文件是非常常用的位图文件,...
  • fandongguang0702
  • fandongguang0702
  • 2016年06月26日 10:45
  • 1593

8位bmp图片格式详细说明文档

Bmp图片分为2、4、8、16、24、32位图,24位及以上的图称为真彩图。何为“位”?4位表示其最多有24=16种颜色组成,8位表示其最多有28=256种颜色组成其余类似。一个Bmp图片文档由四部分...
  • IChen86
  • IChen86
  • 2016年01月17日 23:28
  • 3325
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BMP的8位位图转换24位位图
举报原因:
原因补充:

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