比较大的图形,已经存储再内存dc中,要对其中的一些颜色进行替换,除了逐个象素扫描还有别的办法吗,听说有调色板替换什么的,是不是还对dc色深有要求,没找到具体方法,请高手指教

解决方案 »

  1.   

    这个和你图像文件的存储方式有关系的,你的图像文件是调色板+索引还是RGB格式?
    1 试试用正则表达式对图像数据进行替换,也就是替换颜色特征向量。
    2 如果你图像文件是调色板+索引的话,更改调试板就实现颜色的替换了。
      

  2.   

    直接对DIB的内存地址作操作,直接操作DC,那效率低的如果是对DC用SetPixel/GetPixel操作,不需要考虑色深,得到的格式是固定的,如果是直接操作DIB数据就要考虑如果你是真彩色,都不是索引色,何来调色板?对于会直接用DIB存的位图,普通的遍历替换那都是快的忽略不计的时间就能完成的,前提是直接操作DIB数据,而非操作DC
      

  3.   

    我这里的情况是这样的,用一个叫IPicture的类读取一个wmf文件,再用他的Render方法可以输出到任意dc上,而我就输出到了一个内存dc,然后再处理,输出,这个内存dc是用桌面dc的兼容创建的,应该是16位或32位的,而其实我需要显示的用256色足以,但又不知道怎么样创建256色的dc和位图,如果可以用256色位图是不是就可以通过修改调色板来改变某种颜色,比如黑色变白色,而不是直接操作dc,主要目的是让他快些
      

  4.   

    简单的说一下,你可以首先创建一个逻辑调色板
    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
    你可以创建多个逻辑调色板,来对应你需要修改的颜色
      

  5.   

    还是不明白,pDC哪儿来的啊,还是用CreateCompatibleDC创建的吗,位图又怎么创建呢
      

  6.   

    参见: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);
      

  7.   


    CreateDIBSection可以创建任意格式的DIB位图