社区
图形处理/算法
帖子详情
Hbitmap 24位转8位
泡泡冒
2008-10-13 04:06:15
没有接触过图像处理方面的东西
我一个图像R=G=B得24位图 数据格式HBITMAP得 我如何将他转换为8位得灰度图
...全文
347
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
本文深入探讨了OpenCV4库中图像转换的核心代码,详细解析了从Mat对象转换到H
BITMAP
的过程,包括创建位图信息头、创建设备独立位图、数据类型转换等关键步骤,适用于希望深入了解OpenCV图像显示机制的开发者。
matlab 将
24
位图转换为
8位
图,实现1位,4位,
8位
,
24
位BMP位图的互相转换的方法
这段代码展示了如何在MATLAB环境中将
24
位位图转换为
8位
位图,同时提供了1位、4位、
8位
及
24
位BMP位图之间的转换方法。通过使用C++的函数`SaveTrueBmp`和`ChangeToTrueBmp`,实现了从位图文件加载、处理调色板、获取DIB位图数据并最终保存为不同位深BMP文件的过程。
H
BITMAP
转储JPG文件,源码示例
这是一个C++函数,用于将H
BITMAP
类型的位图压缩成JPG文件。函数支持16位(ARGB1555)、
24
位和32位颜色深度的位图,并使用jpeglib库进行转换。代码中包含了获取位图颜色分量的内联函数,以及对不同颜色深度位图的预处理操作。
linux 如何将32位图转为
24
位,实现1位,4位,
8位
,
24
位BMP位图的互相转换的方法,32
位转
24
位...
本文介绍了一个实用的程序,演示如何将32位颜色的位图转换为
24
位颜色的位图。程序首先加载32位位图,然后创建
24
位位图文件,并将32位位图数据中的RGB值提取出来,忽略Alpha通道,最终保存为
24
位位图。
FreeImage Convert Btween FI
BITMAP
and H
BITMAP
本文介绍了使用FreeImage库进行FI
BITMAP
与H
BITMAP
之间的转换方法,并详细解释了为何某些格式无法直接转换为JPEG,包括对于图像颜色深度的要求。
图形处理/算法
19,464
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章