gpt4 book ai didi

c# - 将颜色过滤器应用于位图对象

转载 作者:太空狗 更新时间:2023-10-30 01:24:18 25 4
gpt4 key购买 nike

我找到了 this code关于如何在 C# 中将滤色器应用于位图对象。它的问题是它使用不安全的代码来完成此操作。是否有一种管理的、安全的方法来做同样的事情?我知道我可以使用像 AForge.NET 或类似的库,但我希望有一种简单的方法来应用滤色器。我需要的只是简单的颜色替换,用黄色替换白色像素。有什么建议吗?

最佳答案

您始终可以使用安全的 GetPixel 和 SetPixel 方法,但是在许多像素上使用它们时速度很慢,这就是您使用不安全方法来使用指向位图内存的指针的原因。不安全的是这样做的方式。

如果您的位图非常小并且您不太关心性能,请使用 GetPixel 和 SetPixel 方法。

    private void ReplaceColor(Bitmap bitmap, Color originalColor, Color replacementColor)
{
for (var y = 0; y < bitmap.Height; y++)
{
for (var x = 0; x < bitmap.Width; x++)
{
if (bitmap.GetPixel(x, y) == originalColor)
{
bitmap.SetPixel(x, y, replacementColor);
}
}
}
}

private unsafe void ReplaceColorUnsafe(Bitmap bitmap, byte[] originalColor, byte[] replacementColor)
{
if (originalColor.Length != replacementColor.Length)
{
throw new ArgumentException("Original and Replacement arguments are in different pixel formats.");
}

if (originalColor.SequenceEqual(replacementColor))
{
return;
}

var data = bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size),
ImageLockMode.ReadWrite,
bitmap.PixelFormat);

var bpp = Image.GetPixelFormatSize(data.PixelFormat);

if (originalColor.Length != bpp)
{
throw new ArgumentException("Original and Replacement arguments and the bitmap are in different pixel format.");
}

var start = (byte*)data.Scan0;
var end = start + data.Stride;

for (var px = start; px < end; px += bpp)
{
var match = true;

for (var bit = 0; bit < bpp; bit++)
{
if (px[bit] != originalColor[bit])
{
match = false;
break;
}
}

if (!match)
{
continue;
}

for (var bit = 0; bit < bpp; bit++)
{
px[bit] = replacementColor[bit];
}
}

bitmap.UnlockBits(data);
}

用法是:

        this.ReplaceColor(myBitmap, Color.White, Color.Yellow); // SLOW

        var orgRGB = new byte[] { 255, 255, 255 }; // White (in RGB format)
var repRGB = new byte[] { 255, 255, 0 }; // Yellow (in RGB format)

var orgARGB = new byte[] { 255, 255, 255, 255 }; // White (in ARGB format)
var repARGB = new byte[] { 255, 255, 255, 0 }; // Yellow (in ARGB format)

var orgRGBA = new byte[] { 255, 255, 255, 255 }; // White (in RGBA format)
var repRGBA = new byte[] { 255, 255, 0, 255 }; // Yellow (in RGBA format)

var orgBytes = orgRGB; // or ARGB or RGBA, depending on bitmap's pixel format
var repBytes = repRGB; // or ARGB or RGBA, depending on bitmap's pixel format

this.ReplaceColorUnsafe(myBitmap, orgBytes, repBytes); // FAST

关于c# - 将颜色过滤器应用于位图对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9858202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com