请教图形颜色替换 比较大的图形,已经存储再内存dc中,要对其中的一些颜色进行替换,除了逐个象素扫描还有别的办法吗,听说有调色板替换什么的,是不是还对dc色深有要求,没找到具体方法,请高手指教 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个和你图像文件的存储方式有关系的,你的图像文件是调色板+索引还是RGB格式?1 试试用正则表达式对图像数据进行替换,也就是替换颜色特征向量。2 如果你图像文件是调色板+索引的话,更改调试板就实现颜色的替换了。 直接对DIB的内存地址作操作,直接操作DC,那效率低的如果是对DC用SetPixel/GetPixel操作,不需要考虑色深,得到的格式是固定的,如果是直接操作DIB数据就要考虑如果你是真彩色,都不是索引色,何来调色板?对于会直接用DIB存的位图,普通的遍历替换那都是快的忽略不计的时间就能完成的,前提是直接操作DIB数据,而非操作DC 我这里的情况是这样的,用一个叫IPicture的类读取一个wmf文件,再用他的Render方法可以输出到任意dc上,而我就输出到了一个内存dc,然后再处理,输出,这个内存dc是用桌面dc的兼容创建的,应该是16位或32位的,而其实我需要显示的用256色足以,但又不知道怎么样创建256色的dc和位图,如果可以用256色位图是不是就可以通过修改调色板来改变某种颜色,比如黑色变白色,而不是直接操作dc,主要目的是让他快些 简单的说一下,你可以首先创建一个逻辑调色板 LPLOGPALETTE pLogPal; pLogPal=(LPLOGPALETTE)malloc(sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*256); pLogPal->palVersion=0x300; pLogPal->palNumEntries=256; for(int i=0;i<256;i++) { pLogPal->palPalEntry[i].peRed=i; //初始化为红色 pLogPal->palPalEntry[i].peGreen=0; pLogPal->palPalEntry[i].peBlue=0; pLogPal->palPalEntry[i].peFlags=0; } if(!m_Palette.CreatePalette(pLogPal)) AfxMessageBox("Can't create palette!");然后这样实现设备DC pDC->SelectPalette(&m_Palette,FALSE); pDC->RealizePalette();然后将你的图像载入DC你可以创建多个逻辑调色板,来对应你需要修改的颜色 还是不明白,pDC哪儿来的啊,还是用CreateCompatibleDC创建的吗,位图又怎么创建呢 参见:GDI+ SDK参考对图像重新着色,一章中GDI+ 使用颜色矩阵对单色进行变换 有关矩阵和变换的更详细的讨论,请参见坐标系统和变形。下面的示例采用一个使用一种颜色 (0.2, 0.0, 0.4, 1.0) 的图像,并应用上一段中描述的变换。Image image(L"InputColor.bmp");ImageAttributes imageAttributes;UINT width = image.GetWidth();UINT height = image.GetHeight();ColorMatrix colorMatrix = { 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.2f, 0.2f, 0.2f, 0.0f, 1.0f}; imageAttributes.SetColorMatrix( &colorMatrix, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap); graphics.DrawImage(&image, 10, 10);graphics.DrawImage( &image, Rect(120, 10, width, height), // destination rectangle 0, 0, // upper-left corner of source rectangle width, // width of source rectangle height, // height of source rectangle UnitPixel, &imageAttributes); CreateDIBSection可以创建任意格式的DIB位图 保存函数指针呢? MFC多文档程序中,如何在Doc类中获取ChildFrame的指针? 关于settimer的问题 窗口句柄的获取 关于sock的I/O模型的使用问题 求教一个简单的问题!急!!! 如何自由控制线程? 遇到一个怪问题! 关于CSpinButtonCtrl 求助关于Dlg.DoMdal()生成的对话框上的OnOk响应,谢谢! wince 问题:怎么在工具栏里加入一个按钮,编译运行后却看不到啊? 在线等~~~~~~~~~~~~~如何在框架类中得到资源管理器MFC框架的右视类的指针
1 试试用正则表达式对图像数据进行替换,也就是替换颜色特征向量。
2 如果你图像文件是调色板+索引的话,更改调试板就实现颜色的替换了。
LPLOGPALETTE pLogPal;
pLogPal=(LPLOGPALETTE)malloc(sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*256);
pLogPal->palVersion=0x300;
pLogPal->palNumEntries=256;
for(int i=0;i<256;i++)
{
pLogPal->palPalEntry[i].peRed=i; //初始化为红色
pLogPal->palPalEntry[i].peGreen=0;
pLogPal->palPalEntry[i].peBlue=0;
pLogPal->palPalEntry[i].peFlags=0;
}
if(!m_Palette.CreatePalette(pLogPal))
AfxMessageBox("Can't create palette!");
然后这样实现设备DC
pDC->SelectPalette(&m_Palette,FALSE);
pDC->RealizePalette();然后将你的图像载入DC
你可以创建多个逻辑调色板,来对应你需要修改的颜色
有关矩阵和变换的更详细的讨论,请参见坐标系统和变形。
下面的示例采用一个使用一种颜色 (0.2, 0.0, 0.4, 1.0) 的图像,并应用上一段中描述的变换。
Image image(L"InputColor.bmp");
ImageAttributes imageAttributes;
UINT width = image.GetWidth();
UINT height = image.GetHeight();ColorMatrix colorMatrix = {
2.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.2f, 0.2f, 0.2f, 0.0f, 1.0f};
imageAttributes.SetColorMatrix(
&colorMatrix,
ColorMatrixFlagsDefault,
ColorAdjustTypeBitmap);
graphics.DrawImage(&image, 10, 10);graphics.DrawImage(
&image,
Rect(120, 10, width, height), // destination rectangle
0, 0, // upper-left corner of source rectangle
width, // width of source rectangle
height, // height of source rectangle
UnitPixel,
&imageAttributes);
CreateDIBSection可以创建任意格式的DIB位图