社区
图形处理/算法
帖子详情
Hbitmap 24位转8位
泡泡冒
2008-10-13 04:06:15
没有接触过图像处理方面的东西
我一个图像R=G=B得24位图 数据格式HBITMAP得 我如何将他转换为8位得灰度图
...全文
348
12
打赏
收藏
Hbitmap 24位转8位
没有接触过图像处理方面的东西 我一个图像R=G=B得24位图 数据格式HBITMAP得 我如何将他转换为8位得灰度图
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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位的,首先要建立该头结构,然后是调色板,最后是点阵数据(值为像素颜色在调色板中的索引)。
Mat转H
BITMAP
C
Bitmap
本转换代码从opencv源码 imshow中提取并改造而成 源码来自与opencv4库 与openCV3有些许不同这里给出内部用到的转换代码 ,拿到H
BITMAP
句柄后 再使用 C
Bitmap
m_
bitmap
;m_
bitmap
.Attach(hbmp);便可以转换为C
Bitmap
对象 H
BITMAP
MattoHBMP(cv::Mat & Image) { H
BITMAP
hb...
matlab 将
24
位图转换为
8位
图,实现1位,4位,
8位
,
24
位BMP位图的互相转换的方法
BOOL SaveTrueBmp(H
BITMAP
h
Bitmap
, CString FileName){//设备描述表HDC hDC;//真彩色位图中每象素所占字节数为
24
WORD wBitCount=
24
;//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0,dwWritt...
H
BITMAP
转储JPG文件,源码示例
/* 获得 A1R5G5B5 红色分量 */ inline BYTE R1555( unsigned short clr ) { return ( (clr & 0x7C00 ) >> 7) & 0x0ff; } /* 获得 A1R5G5B5 绿色分量 */ inline BYTE G1555( unsigned short clr ) { return (
linux 如何将32位图转为
24
位,实现1位,4位,
8位
,
24
位BMP位图的互相转换的方法,32
位转
24
位...
from:BOOL SaveTrueBmp(H
BITMAP
h
Bitmap
, CString FileName){//设备描述表HDC hDC;//真彩色位图中每象素所占字节数为
24
WORD wBitCount=
24
;//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, d...
FreeImage Convert Btween FI
BITMAP
and H
BITMAP
FreeImage的官方FAQ中提及了,FI
BITMAP
与H
BITMAP
的转换,在这里做一下搬运工 FI
BITMAP
* FImageTool::ConvertHbimapToFi
bitmap
(H
BITMAP
hbmp) { FI
BITMAP
*dib = NULL; if(hbmp) {
BITMAP
bm = { 0 }; int ret = G
图形处理/算法
19,464
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章