在我的灰度图中,我需要找到具体的值并用某种颜色(例如黄色)替换它。这是我现在的代码,但速度并不像我所需要的那么快。有没有更有效的方法来实现这一目标?我对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