如何灰度? 对一张任意的图像,如何得到它的灰度图像? 用C语言如何实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.cnblogs.com/itants/archive/2010/08/02/1790336.html 我图像代码几乎不会,有没有完整代码?包括读出图像到byte? 这样更容易上手非常感谢! 彩色转灰度在RGB空间转换就是: (R,G,B)=》(Gray,Gray,Gray)其中Gray=0.299R+0.587G+0.114B;"对一张任意的图像,如何得到它的灰度图像?用C语言如何实现?"首先要取得RGB像素;(分析图像格式)然后用上述公式转换为灰度。 CDC *pDC = GetDC(); HBITMAP hbmp=(HBITMAP)LoadImage(NULL, m_csFilePath,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); CBitmap cbmp; cbmp.Attach(hbmp); BITMAP bmp; cbmp.GetBitmap(&bmp); cbmp.Detach(); UINT * pData = new UINT[bmp.bmWidth * bmp.bmHeight]; BITMAPINFO bmpInfo; bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = bmp.bmWidth; bmpInfo.bmiHeader.biHeight = -bmp.bmHeight; bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biCompression = BI_RGB; bmpInfo.bmiHeader.biBitCount = 32; GetDIBits(pDC-> m_hDC,hbmp,0,bmp.bmHeight,pData,&bmpInfo,DIB_RGB_COLORS); UINT color, r, g, b; for(int i = 0;i < bmp.bmWidth*bmp.bmHeight;i++) { color = pData[i]; b = (color << 8 >> 24)*0.114; g = (color << 16 >> 24)*0.587; r = (color << 24 >> 24)*0.229; pData[i] = RGB(r, g, b); } SetDIBits(pDC-> m_hDC, hbmp,0, bmp.bmHeight, pData,&bmpInfo, DIB_RGB_COLORS); 上面设置好后可以把BMP图片保存起来void CCatchScreenDlg::SaveBitmapToFile(HBITMAP hBmp, LPCWSTR lpfilename){ HDC hdc; //设备描述表 int ibits; WORD wbitcount; //当前显示分辨率下每个像素所占字节数 //位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数 DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten; BITMAP bitmap; //位图属性结构 BITMAPFILEHEADER bmfhdr; //位图文件头结构 BITMAPINFOHEADER bi; //位图信息头结构 LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hdib, hpal, holdpal=NULL; //计算位图文件每个像素所占字节数 hdc = CreateDC(L"DISPLAY", NULL, NULL, NULL); ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES); DeleteDC(hdc); 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; else wbitcount = 32; //计算调色板大小 if (wbitcount <= 8) dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD); //设置位图信息头结构 GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bitmap.bmWidth; bi.biHeight = bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wbitcount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)* 4 * bitmap.bmHeight ; //为位图内容分配内存 hdib = GlobalAlloc(GHND,dwbmbitssize + dwpalettesize + sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib); *lpbi = bi; // 处理调色板 hpal = GetStockObject(DEFAULT_PALETTE); if (hpal) { hdc = ::GetDC(NULL); holdpal = SelectPalette(hdc, (HPALETTE)hpal, false); RealizePalette(hdc); } // 获取该调色板下新的像素值 GetDIBits(hdc, hBmp, 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(lpfilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL| FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return; // 设置位图文件头 bmfhdr.bfType = 0x4d42; // "bm" dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwpalettesize + dwbmbitssize; bmfhdr.bfSize = dwdibsize; bmfhdr.bfReserved1 = 0; bmfhdr.bfReserved2 = 0; bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwpalettesize; // 写入位图文件头 WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL); // 写入位图文件其余内容 WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL); //清除 GlobalUnlock(hdib); GlobalFree(hdib); CloseHandle(fh); } 第一个参数就是要保存的BMP句柄,就是5楼最后SetDIBits中的那个hbmp,第二个参数就是保存图片的位置 Gray=0.299R+0.587G+0.114B;取RGB后再套用这个公式 如果不限制代码规模的话可以使用cximage或者opencv图像库,有现成的代码进行转换 请问RTP传输视频应该怎么进行差错控制? 新手学习VC++ Install shield 生成的安装包安装后有"Debug Assertion Failed"错误. win32应用程序中如何调用mfc的对话框类 新手求教!!! 如何从自定义的类中直接获得系统消息??? 简单问题! 客户端如何'立即'向多服务器轮流发送请求并获得数据 关天CListCtrl的一个问题? 紧急求助!VC高手!GDI高手!DDK高手!Kernel 高手!…… 怎么让状态栏随窗口自动定位,窗口变大时,状态栏也随之移到最下方 请问:如何设置WTL控件CListViewCtrl中的某一行的颜色。
我图像代码几乎不会,有没有完整代码?包括读出图像到byte? 这样更容易上手非常感谢!
其中Gray=0.299R+0.587G+0.114B;"对一张任意的图像,如何得到它的灰度图像?用C语言如何实现?"
首先要取得RGB像素;(分析图像格式)
然后用上述公式转换为灰度。
CDC *pDC = GetDC();
HBITMAP hbmp=(HBITMAP)LoadImage(NULL, m_csFilePath,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
CBitmap cbmp;
cbmp.Attach(hbmp);
BITMAP bmp;
cbmp.GetBitmap(&bmp);
cbmp.Detach();
UINT * pData = new UINT[bmp.bmWidth * bmp.bmHeight];
BITMAPINFO bmpInfo;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = bmp.bmWidth;
bmpInfo.bmiHeader.biHeight = -bmp.bmHeight;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biBitCount = 32; GetDIBits(pDC-> m_hDC,hbmp,0,bmp.bmHeight,pData,&bmpInfo,DIB_RGB_COLORS);
UINT color, r, g, b;
for(int i = 0;i < bmp.bmWidth*bmp.bmHeight;i++)
{
color = pData[i];
b = (color << 8 >> 24)*0.114;
g = (color << 16 >> 24)*0.587;
r = (color << 24 >> 24)*0.229;
pData[i] = RGB(r, g, b);
}
SetDIBits(pDC-> m_hDC, hbmp,0, bmp.bmHeight, pData,&bmpInfo, DIB_RGB_COLORS);
{
HDC hdc; //设备描述表
int ibits;
WORD wbitcount; //当前显示分辨率下每个像素所占字节数 //位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数
DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten; BITMAP bitmap; //位图属性结构
BITMAPFILEHEADER bmfhdr; //位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 //定义文件,分配内存句柄,调色板句柄
HANDLE fh, hdib, hpal, holdpal=NULL; //计算位图文件每个像素所占字节数
hdc = CreateDC(L"DISPLAY", NULL, NULL, NULL);
ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
DeleteDC(hdc); 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;
else
wbitcount = 32; //计算调色板大小
if (wbitcount <= 8)
dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD); //设置位图信息头结构
GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bitmap.bmWidth;
bi.biHeight = bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wbitcount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0; dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)* 4 * bitmap.bmHeight ;
//为位图内容分配内存
hdib = GlobalAlloc(GHND,dwbmbitssize + dwpalettesize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
*lpbi = bi; // 处理调色板
hpal = GetStockObject(DEFAULT_PALETTE);
if (hpal)
{
hdc = ::GetDC(NULL);
holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);
RealizePalette(hdc);
} // 获取该调色板下新的像素值
GetDIBits(hdc, hBmp, 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(lpfilename, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|
FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return; // 设置位图文件头
bmfhdr.bfType = 0x4d42; // "bm"
dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+
dwpalettesize + dwbmbitssize;
bmfhdr.bfSize = dwdibsize;
bmfhdr.bfReserved1 = 0;
bmfhdr.bfReserved2 = 0;
bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +
(DWORD)sizeof(BITMAPINFOHEADER)+ dwpalettesize; // 写入位图文件头
WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL); // 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);
//清除
GlobalUnlock(hdib);
GlobalFree(hdib);
CloseHandle(fh); } 第一个参数就是要保存的BMP句柄,就是5楼最后SetDIBits中的那个hbmp,第二个参数就是保存图片的位置
取RGB后再套用这个公式