0

我有一个 .NEF 图像。我安装了编解码器,然后使用下面的代码来显示它:

BitmapDecoder bmpDec = BitmapDecoder.Create(new Uri(@"C:\Temp\Img0926.nef"), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
BitmapSource srs = bmpDec.Frames[0];
this.imgDisplayed4.Source = srs;
this.imgDisplayed4.Stretch = Stretch.UniformToFill;
  • imgDisplayed4 是图像控件。

然后使用以下代码创建 bmp 并保存:

Bitmap bmp = new Bitmap(srs.PixelWidth, srs.PixelHeight, System.Drawing.Imaging.PixelFormat.Format48bppRgb);
System.Drawing.Imaging.BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format48bppRgb);
srs.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
bmp.UnlockBits(data);
bmp.Save(@"C:\Temp\Images\Img0926-1.bmp");

它保存了 bmp 文件,但是,bmp 中的颜色似乎有一些变化。我附上了3个屏幕截图。第一个是Windows Photo Viewer 显示的保存的bmp 文件,第二个是原始.NEF 图像,第三个是图像控件中显示的图像。

我们可以看到它们都是相似的。但是,第 2 和第 3 个颜色相似,并且与第 1 个不同。

我搜索了很多,我能找到的都与我正在做的类似。但是,它们都是针对 Format32bppRgb 的。问题可能是因为我使用的图像是 Format48bppRgb 吗?有人知道吗?以及如何解决这个问题?

谢谢

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

1

我意识到第 1 和第 2 图像之间的区别是:如果我们在第 1 图像中切换颜色红色部分和 B 部分,那么我们得到第 2 图像。因此,我将代码更改为:

System.Drawing.Imaging.BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format48bppRgb);

unsafe
{
    srs.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
    for (var row = 0; row < srs.PixelHeight; row++)
    {
        for (var col = 0; col < srs.PixelWidth; col++)
        {
            byte* pixel = (byte*)data.Scan0 + (row * data.Stride) + (col * 6);

            var val1 = pixel[1];
            var val3 = pixel[3];
            var val2 = pixel[2];
            var val4 = pixel[4];
            var val5 = pixel[5];
            var val0 = pixel[0];

            //// 0, 1: B, 2:3: G, 4, 5: R
            pixel[5] = val1;
            pixel[4] = val0;

            pixel[0] = val4;
            pixel[1] = val5;


        }
    }

}
bmp.UnlockBits(data);

现在,结果是正确的。

当 PixelFormat 为 Format48bppRgb 时,BitmapSource.CopyPixels 中似乎存在错误。它按照 BGR 而不是 RGB 的顺序复制像素。

任何人都明白为什么我必须切换 R&B 部分?还有其他建议吗?

无论如何,它现在工作正常。我花了 10 多个小时才弄清楚这一点,以后可能会有其他人需要这个。希望能帮助到你。

谢谢

于 2013-06-14T15:48:23.307 回答