快速的BitmapSource图像处理

时间:2019-07-29 08:46:15

标签: c# wpf image bitmapsource

我正在使用多摄像机查看器软件,因此需要处理传入的图像。 因为WPF控件和相机libray都处理BitmapSource,所以我想避免使用BitmapSource-> bitmap-> BitmapSource转换来操纵我的图像。

我有非常简单的图像处理需求:

  • 水平/垂直翻转
  • 作物
  • 调整大小
  • 亮度/对比度
  • 色调映射(灰度,棕褐色)

我成功进行了翻页/裁剪/调整大小(尚无性能基准测试),但找不到任何适合音调映射的解决方案。

我在每个WriteableBitmap像素上尝试了一个简单的循环,但是性能非常差(比使用位图颜色矩阵慢大约5倍) 然后尝试使用WriteablBitmapEx库,但是“ ForEach”方法也很慢。

public static BitmapSource Sepia(this BitmapSource bitmapSource)
{
    WriteableBitmap wb = new WriteableBitmap(bitmapSource);
    uint[] PixelData = new uint[wb.PixelWidth * wb.PixelHeight];
    wb.CopyPixels(PixelData, 4 * wb.PixelWidth, 0);

    for (uint y = 0; y < wb.PixelHeight; y++)
    {
        for (uint x = 0; x < wb.PixelWidth; x++)
        {
            uint pixel = PixelData[y * wb.PixelWidth + x];
            byte[] dd = BitConverter.GetBytes(pixel);

            int Bi = (int)dd[0];
            int Gi = (int)dd[1];
            int Ri = (int)dd[2];

            int R = (int)(.393f * Ri + .769f * Gi + .189f * Bi);
            int G = (int)(.349f * Ri + .686f * Gi + .168f * Bi);
            int B = (int)(.272 * Ri + .534 * Gi + .131f * Bi);

            if (B < 0) B = 0;
            if (B > 255) B = 255;
            if (G < 0) G = 0;
            if (G > 255) G = 255;
            if (R < 0) R = 0;
            if (R > 255) R = 255;

            dd[0] = (byte)B;
            dd[1] = (byte)G;
            dd[2] = (byte)R;
            PixelData[y * wb.PixelWidth + x] = BitConverter.ToUInt32(dd, 0);
        }
    }
    wb.WritePixels(new Int32Rect(0, 0, wb.PixelWidth, wb.PixelHeight), PixelData, 4 * wb.PixelWidth, 0);

    return wb;
}

因此,到目前为止,我仍将BitmapSource转换为用于颜色矩阵的Bitmap。 但我想还有更好的方法(像素着色器,外部libray等)

谢谢

0 个答案:

没有答案