真彩色如何转换成256色

erace992001 2009-11-16 10:51:57
图像数据是DIB数据,谁能提供一种快速的方法转换成256色DIB数据,谢谢!
...全文
284 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglifei007 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cloudyi 的回复:]
判断DIB的位图信息头biBitCount, 如果是8, 说明图像为灰度图像不用进行转换了, 如果不为8, 一般的为24, 即真彩色图像, 可以获取其中的R, G, B分量, 对R, G, B分量进行简单的运算即可获得灰度图像, 公式如下:
data = (BYTE)(0.299 * R + 0.587 * G + 0.114 * B);即实现了向灰度图像的转换
[/Quote]

楼上的方式是比较正统的,因为人眼对红绿蓝的识别能力有差别,所以这样处理;
如果楼主要简单快速的,直接且RGB的平均值就行了,速度很快,而且不涉及浮点运算,在嵌入式中很实用

Value = (BYTE)(R + G + B)/3;
maquan 2009-11-18
  • 打赏
  • 举报
回复
用 CxImage 吧,爽死了!
wenstory 2009-11-18
  • 打赏
  • 举报
回复
mark
正在找相关内容
shenyi0106 2009-11-18
  • 打赏
  • 举报
回复
mark
wqvbjhc 2009-11-18
  • 打赏
  • 举报
回复
LZ说的是256色图,怎么大家都说成灰度图了
256色图并不一定是灰度图。灰度图只是256色图中的一种
huabeiyg811 2009-11-18
  • 打赏
  • 举报
回复
R=G=B=灰度值
loop_k 2009-11-17
  • 打赏
  • 举报
回复

BOOL CDibImage::ColorToGray(LPSTR lpDIB, LONG lWidth, LONG lHeight)
{
// 找到DIB图像象素起始位置
LPSTR lpDIBBits; // 指向DIB象素指针
lpDIBBits =FindDIBBits(lpDIB);

LPBITMAPINFOHEADER lpDIBHdr; // 指向BITMAPINFOHEADER的指针
lpDIBHdr = (LPBITMAPINFOHEADER)lpDIB;

LPSTR lpGrayBits;

// 计算位图图的信息头、调色板和图形数据的大小, 并给灰度图分配内存
int dwInfo = lpDIBHdr->biSize; //本结构所占用的字节数
int dwData = lpDIBHdr->biSizeImage; //图像的大小 以字节为单位
dwData=(lpDIBHdr->biHeight) * (lpDIBHdr->biWidth);
int dwGrayData = dwData/3;
int dwGrayPal = 256 * sizeof(RGBQUAD);//调色板的大小
int sizeTotal=dwInfo+dwGrayPal+dwGrayData;




if(24==lpDIBHdr->biBitCount) //24位真彩色转256色灰度图
{

// 创建灰度图的颜色表
RGBQUAD* lpGrayRgbQuag=(RGBQUAD*)(lpDIB+lpDIBHdr->biSize);//指向内存中的灰度颜色表

int rowLenSr=WIDTHBYTES(24*lpDIBHdr->biWidth);//行字节数
int rowLenDes=WIDTHBYTES(8*lpDIBHdr->biWidth);
int sizeGrayBits=rowLenDes*lpDIBHdr->biHeight;

int i;

lpDIBHdr->biSizeImage=sizeTotal;
lpDIBHdr->biBitCount=8; //每个像素所需要的位数
lpDIBHdr->biClrUsed=256;

for(i=0;i <256;i++)
{
lpGrayRgbQuag->rgbBlue=i;
lpGrayRgbQuag->rgbGreen=i;
lpGrayRgbQuag->rgbRed=i;
lpGrayRgbQuag->rgbReserved=0;
lpGrayRgbQuag++;//写入内存中的灰度颜色表

}

//图像区转换
HGLOBAL hGray=(HGLOBAL)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, sizeGrayBits);//分配内存
lpGrayBits = (LPSTR) ::GlobalLock(hGray);//内存数据指针

if (hGray==0)
{
return false; //内存分配失败则返回false
}

LPBYTE lpos=(LPBYTE)lpDIBBits;

BYTE nGray;

int x,y,z,m,pos;

for( y=0; y <lpDIBHdr->biHeight; y++ )
{
pos = 0;
pos = y*rowLenSr;
m = 0;
m = y*rowLenDes;
for( x=0,z=m; x <rowLenSr; x=x+3,z++)
{
nGray = (BYTE)( lpos[pos+x]*0.114 + lpos[pos+x+1]*0.587 + lpos[pos+x+2]*0.299);
lpGrayBits[z] = (unsigned char) nGray;
}
}

memcpy(lpGrayRgbQuag,lpGrayBits,sizeGrayBits);
::GlobalUnlock( hGray );



}



if(32==lpDIBHdr->biBitCount) //32位真彩色转256色灰度图
{

// 创建灰度图的颜色表
RGBQUAD* lpGrayRgbQuag=(RGBQUAD*)(lpDIB+lpDIBHdr->biSize);//指向内存中的灰度颜色表

int rowLenSr=WIDTHBYTES(32*lpDIBHdr->biWidth);//行字节数
int rowLenDes=WIDTHBYTES(8*lpDIBHdr->biWidth);
int sizeGrayBits=rowLenDes*lpDIBHdr->biHeight;

int i;

lpDIBHdr->biSizeImage=sizeTotal;
lpDIBHdr->biBitCount=8; //每个像素所需要的位数
lpDIBHdr->biClrUsed=256;

for(i=0;i <256;i++)
{
lpGrayRgbQuag->rgbBlue=i;
lpGrayRgbQuag->rgbGreen=i;
lpGrayRgbQuag->rgbRed=i;
lpGrayRgbQuag->rgbReserved=0;
lpGrayRgbQuag++;//写入内存中的灰度颜色表

}

//图像区转换
HGLOBAL hGray=(HGLOBAL)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, sizeGrayBits);//分配内存
lpGrayBits = (LPSTR) ::GlobalLock(hGray);//内存数据指针

if (hGray==0)
{
return false; //内存分配失败则返回false
}

LPBYTE lpos=(LPBYTE)lpDIBBits;

BYTE nGray;

int x,y,z,m,pos;

for( y=0; y <lpDIBHdr->biHeight; y++ )
{
pos = 0;
pos = y*rowLenSr;
m = 0;
m = y*rowLenDes;
for( x=0,z=m; x <rowLenSr; x=x+4,z++)
{
nGray = (BYTE)( lpos[pos+x]*0.114 + lpos[pos+x+1]*0.587 + lpos[pos+x+2]*0.299);
lpGrayBits[z] = (unsigned char) nGray;
}
}

memcpy(lpGrayRgbQuag,lpGrayBits,sizeGrayBits);
::GlobalUnlock( hGray );


}
return TRUE;

}
cloudyi 2009-11-17
  • 打赏
  • 举报
回复
判断DIB的位图信息头biBitCount, 如果是8, 说明图像为灰度图像不用进行转换了, 如果不为8, 一般的为24, 即真彩色图像, 可以获取其中的R, G, B分量, 对R, G, B分量进行简单的运算即可获得灰度图像, 公式如下:
data = (BYTE)(0.299 * R + 0.587 * G + 0.114 * B);即实现了向灰度图像的转换
liuchui2009 2009-11-16
  • 打赏
  • 举报
回复
看看是否有你要的答案

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧