在我的灰度圖中,我需要找到具體的值並用某種顏色(例如黃色)替換它。這是我現在的代碼,但速度並不像我所需要的那麼快。有沒有更有效的方法來實現這一目標?我對ColorMatrix類有紅色,但找不到替換單個值而不影響整個圖像的方式。替換位圖/圖像中特定顏色的有效方法
unsafe
{
byte stlThres = 115;
int bytePerPixel = Image.GetPixelFormatSize(kpImageViewer1.Image.PixelFormat)/8;
var data = kpImageViewer1.Image.LockBits(new Rectangle(0, 0, kpImageViewer1.Image.Width, kpImageViewer1.Image.Height), ImageLockMode.WriteOnly, kpImageViewer1.Image.PixelFormat);
for (int y = 0; y < data.Height; y++)
{
byte* row = (byte*)data.Scan0 + (y * data.Stride);
for (int x = 0; x < data.Width; x++, row += bytePerPixel)
{
if (row[0] == stlThres)
{
row[0] = 0; //b
row[1] = 255; //g
row[2] = 255; //r
if (bytePerPixel == 4)
{
row[3] = 255; //a
}
}
}
}
kpImageViewer1.Image.UnlockBits(data);
}
你可以試試BitBlt。 [Here's](http://www.vbaccelerator.com/home/VB/Tips/Replace_One_Colour_With_Another_in_a_Picture/article.asp)一個VB示例。 – mbeckish 2013-03-13 13:24:47
非常小的調整可能會移動你的'data.Scan0','data.Width','data.Stride'和'BytePerPixel == 4'檢查循環的外部,因爲它們在整個循環期間是有效的常量循環(最後一個意味着你將不得不復制基本的循環結構)。它可能會提供一個小的(但振振頻率的_可測量的改進,取決於這稱爲的頻率和位圖的大小) – 2013-03-13 13:31:46
添加圖像的結果和實際結果 – KF2 2013-04-03 17:12:36