将某颜色替换成某颜色,比如红色替换成白色,红色的RGB值不是固定的,因为有深有浅.希望有效率高点的算法,SetPixel这个效率比较低,耗时比较长,用ColorMatrix或BitmapData效率高点,但是自己不会写,网上找不到,诶.

解决方案 »

  1.   

    http://topic.csdn.net/u/20100526/16/bf002752-8fcf-4c6e-a8a5-5d712b7614a9.html?88733
      

  2.   

    没仔细测,按自己以前的代码修改了一下
     private void ChangeColor()
            {
                Bitmap bmSrc = Image.FromFile("C:\\test.bmp");
                BitmapData srcData = bmSrc.LockBits(new Rectangle(0,0,bmSrc.Width,bmSrc.Height), ImageLockMode.ReadWrite, bmSrc.PixelFormat);
                Color color = Color.Red;
                unsafe
                {
                    byte* ptrSrcStart = (byte*)srcData.Scan0;
                    byte* ptrSrc;                int bytecount = bmSrc.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4;                for (int i = 0; i < bmSrc.Height; i++)
                    {
                        ptrSrc = ptrSrcStart + srcData.Stride * i;
                        for (int j = 0; j < bmSrc.Width; j++)
                        {
                                *(ptrSrc++) = color.B;
                                *(ptrSrc++) = color.G;
                                *(ptrSrc++) = color.R;
                                if (bytecount == 4)
                                {
                                    *(ptrSrc++) = color.A;
                                }
                        }
                    }
                }
                bmSrc.UnlockBits(srcData);
            }
      

  3.   

    安全代码就是你说的setpixel.也是循环然后set。效率无比的差。
      

  4.   

    你自己也提到了ColorMatrix或者BitmapData如果是做图像处理(灰度,锐化等),可以考虑用ColorMatrix但你的要求是修改某个颜色为指定颜色,想要快,就用unsafe code + BitmapData
      

  5.   

    Color color = Color.Red;
    颜色你自己可以设置,我只是举个例子,你得学会举一反三....
    Bitmap bmSrc = Image.FromFile("C:\\test.bmp");
    BitmapData srcData = bmSrc.LockBits(new Rectangle(0,0,bmSrc.Width,bmSrc.Height), ImageLockMode.ReadWrite, bmSrc.PixelFormat);
    //设置为红色
    Color color = Color.Red;