gpt4 book ai didi

c# - 在没有外部 dll 的情况下制作图像底片的有效方法

转载 作者:太空狗 更新时间:2023-10-30 00:06:45 25 4
gpt4 key购买 nike

这就是在 C# Windows Forms 中以高效、快速的方式从图像制作负片的解决方案吗?

最佳答案

最好的方法是直接访问带有位图数据的像素。

只是添加一些时间细节:

在 8 兆像素图像上执行 Negate(在 2.4 Ghz Core 2 Duo 上):

  • SetPixel(~22 秒)- 慢 220 倍
  • Color Matrix,Matajon 的以下方法(~750 毫秒)- 慢 7 倍
  • 直接访问位图数据(约 100 毫秒)- 最快

所以,如果你不能有不安全的代码,那么 Color Matrix 比 SetPixel 好得多。

    public static void Negate(Bitmap image)
{
const int RED_PIXEL = 2;
const int GREEN_PIXEL = 1;
const int BLUE_PIXEL = 0;


BitmapData bmData = currentImage.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, image.PixelFormat);

try
{
int stride = bmData.Stride;
int bytesPerPixel = (currentImage.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4);

unsafe
{
byte* pixel = (byte*)(void*)bmData.Scan0;
int yMax = image.Height;
int xMax = image.Width;

for (int y = 0; y < yMax; y++)
{
int yPos = y * stride;
for (int x = areaSize.X; x < xMax; x++)
{
int pos = yPos + (x * bytesPerPixel);

pixel[pos + RED_PIXEL] = (byte)(255 - pixel[pos + RED_PIXEL]);
pixel[pos + GREEN_PIXEL] = (byte)(255 - pixel[pos + GREEN_PIXEL]);
pixel[pos + BLUE_PIXEL] = (byte)(255 - pixel[pos + BLUE_PIXEL]);
}

}
}
}
finally
{
image.UnlockBits(bmData);
}

}

如果你有兴趣,这里是颜色矩阵的代码:

    public static void Negate(Bitmap image)
{

Bitmap clone = (Bitmap) image.Clone();

using (Graphics g = Graphics.FromImage(image))
{

// negation ColorMatrix
ColorMatrix colorMatrix = new ColorMatrix(
new float[][]
{
new float[] {-1, 0, 0, 0, 0},
new float[] {0, -1, 0, 0, 0},
new float[] {0, 0, -1, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {0, 0, 0, 0, 1}
});

ImageAttributes attributes = new ImageAttributes();

attributes.SetColorMatrix(colorMatrix);

g.DrawImage(clone, new Rectangle(0, 0, clone.Width, clone.Height),
0, 0, clone.Width, clone.Height, GraphicsUnit.Pixel, attributes);
}
}

关于c# - 在没有外部 dll 的情况下制作图像底片的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/541331/

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