高分如何把彩色图片变成黑白 如何转换啊?把一个指定的图片框 转换成黑白的 就是通过获得一个图片框的句柄并且让他变成黑白保存到另外一个图片框或者保存到指定文件都可以!并且有需要还可以把黑白转成彩色!我想通过函数来转换而不是直接在程序里面转换 也就是把转换图片色彩的函数写到模块里!高分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VCKBase上有一个演示代码,可以下载来看看。http://www.vckbase.com/code/viewcode.asp?id=1686 在dll里写个函数就行了你说的这种操作对于学过数字图像处理的很容易.主要操作就是求3个数的平均数. 对了 你要灰度图还是黑白2色图啊?灰度的话就fcolor = 0.299R+0.587G+0.114B rgb=(fcolor,fcolor,fcolor)如果是2色黑白图的话就可以取一个阀值来做,可以直接用127来分想转换回去的话,可以直接把原来的保存起来原本以为会的 突然发现不会。 尴尬 楼主是要灰度图吧.RGB改成YUV格式, 然后根据亮度调灰度,去掉颜色即可. // 另存为位图文件BOOL SaveToBmpFile( HBITMAP hBitmap, CString strFileName, int nFileType){ HDC hDC; // 设备描述表 HDC hMemDC; // 内存设备环境 HBRUSH hBrush, hBrushOld; // 画刷句柄 HBITMAP hBmpOld; // 位图句柄 int iBits; // 当前显示分辨率下每个像素所占字节数 WORD wBitCount; // 位图中每个像素所占字节数 DWORD dwPaletteSize = 0,// 定义调色板大小 dwBmBitsSize, // 位图中像素字节大小 dwDIBSize, // 位图文件大小 dwWritten; // 写入文件字节数 BITMAP Bitmap; // 位图属性结构 BITMAPFILEHEADER bmfh; // 位图文件头结构 BITMAPINFOHEADER bmih; // 位图信息头结构 LPBITMAPINFOHEADER lpbi; // 指向位图信息头结构 HANDLE fh, // 文件句柄 hDib, // 分配内存句柄 hPal, // 调色板句柄 hOldPal = NULL; // 调色板句柄 // 计算位图文件每个像素所占字节数 hDC = CreateDC("DISPLAY", NULL, NULL, NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) // Number of adjacent color bits for each pixel. * GetDeviceCaps(hDC, PLANES); // Number of color planes. DeleteDC( hDC ); switch(nFileType) { case 1: iBits = 1; break; // 单色位图(*.bmp;*.dib) case 2: iBits = 4; break; // 16 色位图(*.bmp;*.dib) case 3: iBits = 8; break; // 256 色位图(*.bmp;*.dib) } if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else if (iBits <= 16) wBitCount = 16; else if (iBits <= 24) wBitCount = 24; // 计算调色板大小 if (wBitCount <= 8) dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD); // 设置位图信息头结构 GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap); bmih.biSize = sizeof(BITMAPINFOHEADER); bmih.biWidth = Bitmap.bmWidth; bmih.biHeight = Bitmap.bmHeight; bmih.biPlanes = 1; bmih.biBitCount = wBitCount; bmih.biCompression = BI_RGB; bmih.biSizeImage = 0; bmih.biXPelsPerMeter = 0; bmih.biYPelsPerMeter = 0; bmih.biClrUsed = 0; bmih.biClrImportant = 0; dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32) * 4 *Bitmap.bmHeight; ////////////////////////////////////////////////////////// // 加 // 创建一显示内存(内存设备环境) hDC = ::GetDC(NULL); hMemDC = ::CreateCompatibleDC( hDC ); // 或( NULL ) // 将位图调入该内存中 hBmpOld = (HBITMAP)SelectObject(hMemDC, hBitmap); // 初始化为白色背景 //////////////////////////// // 将白色画刷选入内存设备环境 hBrush = (HBRUSH)GetStockObject( WHITE_BRUSH ); hBrushOld = (HBRUSH)SelectObject( hMemDC, hBrush ); // 将设备环境的背景刷为白色 PatBlt( hMemDC, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, PATCOPY ); // 用自定义字体输出全部字符文本 SetTextColor( hMemDC, RGB(0,0,0) ); SetBkColor( hMemDC, RGB(255,255,255) ); // 输出GB2312字符图形 TextOut(hMemDC, 0, 100, "你好", strlen("你好")); // 还可以加入文字 // 加 ////////////////////////////////////////////////////////// // 为位图内容分配内存 hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bmih; // 处理调色板 hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC = GetDC(NULL); hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 获取该调色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); // 恢复调色板 if (hOldPal) { SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ReleaseDC(NULL, hDC); } // 创建位图文件 fh = CreateFile(strFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; // 设置位图文件头 dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; bmfh.bfType = 0x4D42; // "BM": 0x42 = 'B', 0x4d = 'M' bmfh.bfSize = dwDIBSize; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; bmfh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; // 写入位图文件头 WriteFile(fh, (LPSTR)&bmfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 写入位图文件其余内容 WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); // 清除 GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(fh); SelectObject( hMemDC, hBrushOld ); SelectObject( hMemDC, hBmpOld ); // 恢复原位图 DeleteDC( hMemDC ); // 删除内存设备环境 DeleteDC( hDC ); return 0;} 给你一个类,使用这个类的静态函数就可以产生。譬如常规图片是CBitmap m_pBmNormal;只需CBitmap* m_pGray = CGrapyBitmap::DoGray((HBITMAP)m_BmNormal->m_hObject);这样,一个图片两个效果。绘制彩色图片时使用m_pBmNormal,灰色时m_pGray。 CWnd::CreateEx 套接字传文件,无法完全收到 关于Dll中 exten "C"的弱弱的问题 请问这是什么问题 VC6下重载运算符的一个怪问题 控件重叠和文字浮起来的问题!(在线等待) 文件拷贝时失败,windows不能登陆! 请问高手:怎样控制控件的属性 求助(关于CComboBox。。。 我想好好的学精一下C++请高手推荐几本经典的好书吧。(不胜感激) VS2008安装失败,VS2008无法安装,VS2008安装出错,VS2008安装…… 被主管批评了,为什么我在dll里创建的窗口循环是个死循环啊(附代码)求求了
http://www.vckbase.com/code/viewcode.asp?id=1686
fcolor = 0.299R+0.587G+0.114B
rgb=(fcolor,fcolor,fcolor)如果是2色黑白图的话就可以取一个阀值来做,可以直接用127来分想转换回去的话,可以直接把原来的保存起来
原本以为会的 突然发现不会。 尴尬
BOOL SaveToBmpFile( HBITMAP hBitmap, CString strFileName, int nFileType)
{
HDC hDC; // 设备描述表
HDC hMemDC; // 内存设备环境
HBRUSH hBrush, hBrushOld; // 画刷句柄
HBITMAP hBmpOld; // 位图句柄
int iBits; // 当前显示分辨率下每个像素所占字节数
WORD wBitCount; // 位图中每个像素所占字节数
DWORD dwPaletteSize = 0,// 定义调色板大小
dwBmBitsSize, // 位图中像素字节大小
dwDIBSize, // 位图文件大小
dwWritten; // 写入文件字节数
BITMAP Bitmap; // 位图属性结构
BITMAPFILEHEADER bmfh; // 位图文件头结构
BITMAPINFOHEADER bmih; // 位图信息头结构
LPBITMAPINFOHEADER lpbi; // 指向位图信息头结构
HANDLE fh, // 文件句柄
hDib, // 分配内存句柄
hPal, // 调色板句柄
hOldPal = NULL; // 调色板句柄
// 计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) // Number of adjacent color bits for each pixel.
* GetDeviceCaps(hDC, PLANES); // Number of color planes.
DeleteDC( hDC );
switch(nFileType)
{
case 1: iBits = 1; break; // 单色位图(*.bmp;*.dib)
case 2: iBits = 4; break; // 16 色位图(*.bmp;*.dib)
case 3: iBits = 8; break; // 256 色位图(*.bmp;*.dib)
}
if (iBits <= 1) wBitCount = 1;
else if (iBits <= 4) wBitCount = 4;
else if (iBits <= 8) wBitCount = 8;
else if (iBits <= 16) wBitCount = 16;
else if (iBits <= 24) wBitCount = 24;
// 计算调色板大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);
// 设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = Bitmap.bmWidth;
bmih.biHeight = Bitmap.bmHeight;
bmih.biPlanes = 1;
bmih.biBitCount = wBitCount;
bmih.biCompression = BI_RGB;
bmih.biSizeImage = 0;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrUsed = 0;
bmih.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32)
* 4 *Bitmap.bmHeight;
//////////////////////////////////////////////////////////
// 加
// 创建一显示内存(内存设备环境)
hDC = ::GetDC(NULL);
hMemDC = ::CreateCompatibleDC( hDC ); // 或( NULL )
// 将位图调入该内存中
hBmpOld = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 初始化为白色背景 ////////////////////////////
// 将白色画刷选入内存设备环境
hBrush = (HBRUSH)GetStockObject( WHITE_BRUSH );
hBrushOld = (HBRUSH)SelectObject( hMemDC, hBrush );
// 将设备环境的背景刷为白色
PatBlt( hMemDC, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, PATCOPY ); // 用自定义字体输出全部字符文本
SetTextColor( hMemDC, RGB(0,0,0) );
SetBkColor( hMemDC, RGB(255,255,255) );
// 输出GB2312字符图形
TextOut(hMemDC, 0, 100, "你好", strlen("你好")); // 还可以加入文字
// 加
//////////////////////////////////////////////////////////
// 为位图内容分配内存
hDib = GlobalAlloc(GHND, dwBmBitsSize +
dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bmih;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal) {
hDC = GetDC(NULL);
hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(BITMAPINFO *)lpbi, DIB_RGB_COLORS);
// 恢复调色板
if (hOldPal) {
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}
// 创建位图文件
fh = CreateFile(strFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE) return FALSE;
// 设置位图文件头
dwDIBSize = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ dwPaletteSize + dwBmBitsSize;
bmfh.bfType = 0x4D42; // "BM": 0x42 = 'B', 0x4d = 'M'
bmfh.bfSize = dwDIBSize;
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
// 清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
SelectObject( hMemDC, hBrushOld );
SelectObject( hMemDC, hBmpOld ); // 恢复原位图
DeleteDC( hMemDC ); // 删除内存设备环境
DeleteDC( hDC );
return 0;
}
只需CBitmap* m_pGray = CGrapyBitmap::DoGray((HBITMAP)m_BmNormal->m_hObject);这样,一个图片两个效果。
绘制彩色图片时使用m_pBmNormal,灰色时m_pGray。