Hbitmap 24位转8位

泡泡冒 2008-10-13 04:06:15
没有接触过图像处理方面的东西
我一个图像R=G=B得24位图 数据格式HBITMAP得 我如何将他转换为8位得灰度图
...全文
347 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dirdirdir3 2008-10-23
  • 打赏
  • 举报
回复
gray=Red*0.299 + Green*0.587 + Blue*0.114
tiyuzhongxin789 2008-10-22
  • 打赏
  • 举报
回复
灰度=R*0.299 + G*0.587 + B*0.114,bmp文件格式可以看看 < <windows程序设计>>这本书
Tinary3v0 2008-10-22
  • 打赏
  • 举报
回复
用OpenCV是不是一个函数就可以搞定的?
e_feeling 2008-10-21
  • 打赏
  • 举报
回复
R*0.299 + G*0.587 + B*0.114 位图文件中是以B、G、R顺序存放的。
「已注销」 2008-10-21
  • 打赏
  • 举报
回复
可以参考CXIMAGE中的实现
cdef9108 2008-10-21
  • 打赏
  • 举报
回复
up
giant1st 2008-10-20
  • 打赏
  • 举报
回复
参考程序: http://download.csdn.net/source/702573

点菜单中的 点操作 -- 灰度-- 灰度化
即为 实现的功能

你也可以跟踪来看源码
smpowy 2008-10-20
  • 打赏
  • 举报
回复
/*************************************************************************

* 函数名称:Gray24Bits( )

* 函数类型:LPSTR

* 参数: LPSTR lpDIB - 指向源DIB图像指针

* 返回值: BOOL - 转换成功返回TRUE,否则返回FALSE。

* 函数功能:24位真彩色图像转8位灰度图像

*************************************************************************/
BOOL Gray24Bits(LPSTR lpDIB)
{
// 找到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;


// 创建灰度图的颜色表
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;

if(24==lpDIBHdr->biBitCount)
{

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 );
return TRUE;
}
泡泡冒 2008-10-19
  • 打赏
  • 举报
回复
void Create_DIB( HWND hWnd )
{

HDC hDC;
unsigned char i;
long k,j, NumBytes;
LPBITMAPINFO info;
unsigned char *dat;
DWORD error;

hDC = GetDC (hWnd) ;
// Intialize BITMAPINFOHEADER data.
//.................................
bi.biSize = sizeof (BITMAPINFOHEADER) ;
bi.biWidth = W;
bi.biHeight = -H; // top-down DIB
bi.biPlanes = 1;
bi.biBitCount = COLORBITS;
bi.biCompression = BI_RGB;
bi.biSizeImage = ( ALIGNLONG( (W * COLORBITS)/8 ) * H);
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 256;
bi.biClrImportant = 256;


// Allocate memory for BITMAPINFO structure.
//..........................................
NumBytes = sizeof(BITMAPINFOHEADER) + 256 * sizeof (RGBQUAD) +
( ALIGNLONG( ( W * COLORBITS ) / 8 ) * H );

lpbi = (BITMAPINFOHEADER*)GlobalAlloc( GPTR, NumBytes );

if( lpbi == NULL )
{
// LPVOID lpMsgBuf;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf, 0, NULL );
// Display the string.
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );

exit( EXIT_FAILURE ); // Get out now!
}

// Copy BITMAPINFOHEADER information.
//...................................
*lpbi = bi;

// Create The Palette
info = (LPBITMAPINFO) lpbi;


for ( i=0; i<255; i++ )
{
info->bmiColors[i].rgbRed = i;
info->bmiColors[i].rgbBlue = i;
info->bmiColors[i].rgbGreen = i;
info->bmiColors[i].rgbReserved = 0;
}

// Set pointer to bitmaps bit data.
//..................................
lpstBitmap = (LPSTR)lpbi + (WORD)sizeof(BITMAPINFOHEADER) +
(256 * sizeof(RGBQUAD));

dat = (unsigned char*)lpstBitmap;

for ( k=0; k< H; k++ )
for ( j = 0; j < W; j++ )
*dat++ = (unsigned char)k;

// Create uninitialized DIB bitmap.
//.................................

hBitmap = CreateDIBitmap( hDC,
&bi,
0,
0,
(LPBITMAPINFO) lpbi,
DIB_RGB_COLORS);

error = GetLastError();


ReleaseDC( hWnd, hDC);
}

这样出来得hbitmap是24位,帮忙改改
yangsh3002 2008-10-13
  • 打赏
  • 举报
回复
灰度=R*0.299 + G*0.587 + B*0.114,bmp文件格式可以看看<<windows程序设计>>这本书
泡泡冒 2008-10-13
  • 打赏
  • 举报
回复
能不能给段程序 谢了哈
vcPlayer 2008-10-13
  • 打赏
  • 举报
回复
从HBITMAP可以得到以BITMAPINFOHEADER开始的一段内存(BITMAPINFOHEADER + PALETTE + BITS)。如果要转换为8位的,首先要建立该头结构,然后是调色板,最后是点阵数据(值为像素颜色在调色板中的索引)。

19,464

社区成员

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

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