通過對Yorye Nathan的評論的好奇心,這是我通過修改http://msdn.microsoft.com/en-GB/library/ms229672(v=vs.90).aspx創建的擴展。
它可以將位圖中的所有像素從一種顏色變成另一種顏色。
public static class BitmapExt
{
public static void ChangeColour(this Bitmap bmp, byte inColourR, byte inColourG, byte inColourB, byte outColourR, byte outColourG, byte outColourB)
{
// Specify a pixel format.
PixelFormat pxf = PixelFormat.Format24bppRgb;
// Lock the bitmap's bits.
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData =
bmp.LockBits(rect, ImageLockMode.ReadWrite,
pxf);
// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;
// Declare an array to hold the bytes of the bitmap.
// int numBytes = bmp.Width * bmp.Height * 3;
int numBytes = bmpData.Stride * bmp.Height;
byte[] rgbValues = new byte[numBytes];
// Copy the RGB values into the array.
Marshal.Copy(ptr, rgbValues, 0, numBytes);
// Manipulate the bitmap
for (int counter = 0; counter < rgbValues.Length; counter += 3)
{
if (rgbValues[counter] == inColourR &&
rgbValues[counter + 1] == inColourG &&
rgbValues[counter + 2] == inColourB)
{
rgbValues[counter] = outColourR;
rgbValues[counter + 1] = outColourG;
rgbValues[counter + 2] = outColourB;
}
}
// Copy the RGB values back to the bitmap
Marshal.Copy(rgbValues, 0, ptr, numBytes);
// Unlock the bits.
bmp.UnlockBits(bmpData);
}
}
通過bmp.ChangeColour(0,128,0,0,0,0);
低效的調用,並完全以短的答案。 – SimpleVar 2013-05-02 19:34:58
所以,如果我有一張圖片,我必須得到'GetPixel'和'SetPixel' _n_次,其中_n_是像素的數量。因此,對於一個普通的圖像,甚至是一個標誌,這可能是_n_ = 150k + ... – 2013-05-02 19:37:26
如果在這種語言中已經存在一種方法,它不會在背景中做同樣的迭代嗎? ... – ChocapicSz 2015-09-24 12:20:50