在我的灰度图像中,我需要找到特定的值并用一些颜色(例如黄色)替换它。这是我现在拥有的代码,但它不够快。有没有更有效的方法来实现这个目标呢?我已经阅读了关于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);
}
data.Scan0
,data.Width
,data.Stride
和BytePerPixel == 4
检查完全移出循环,因为它们在循环期间实际上是常量(最后一个意味着您必须复制基本循环结构)。这可能会提供微小的(但有可能是可测量的)改进,具体取决于调用频率和位图大小。 - Chris Sinclair