求【8位灰度图像】转换为【8位256色图像】或【24位真彩图像】算法【黑白型】!!!

南山五味子 2012-07-11 10:05:45
求【8位灰度图像】转换为【8位256色图像】或【24位真彩图像】算法【黑白型】!!!可以保持原有的黑白色调!
...全文
322 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
南山五味子 2012-07-16
  • 打赏
  • 举报
回复
具体咋实现哦,有源码么?
lc519652604 2012-07-15
  • 打赏
  • 举报
回复
大部分处理方法都会失真,双线性插值,三线性插值都会失真,最临近插值算法和线性插值混用最多:
大概思路:
1、新的高度和宽度除以原来的高度和宽度得到两个比之分别记为:B1,B2(假如B1>B2);
2、先把图像扩大小的B2倍,
3、在用B1除以B2,把宽度用线性插值扩大B1除以B2的倍数
主要就是这个思路,具体编程的话我就不复制了,去网上下一个,对着这个思路改一下就是自己的了
南山五味子 2012-07-14
  • 打赏
  • 举报
回复
自己顶了!
南山五味子 2012-07-12
  • 打赏
  • 举报
回复
(HBITMAP)::LoadImage(NULL, m_strBmpPath+"\\res\\bk.bmp", IMAGE_BITMAP, 0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE| LR_LOADFROMFILE);

CBitmap.LoadImage(IDC_BMP)
这两个用法有什么差别!当bk.bmp为8位灰度图,在做透明图像的时候用了第一种方法就不能透明,且将前景图像的颜色自动运算成灰度了;第二种方法就正常,前景图像为24位RGB图,实现透明效果,且颜色不失真。

TransparentBlt2( HDC hdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF类型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

// 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

// 设置透明色
SetBkColor(hImageDC, crTransparent);

// 生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

// 生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// 透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// "或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);

}
fengbingchun 2012-07-11
  • 打赏
  • 举报
回复
看看OpenCV的cvCvtColor源码

19,468

社区成员

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

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