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枚添付しました。1 つ目は Windows フォト ビューアーによって表示される保存された bmp ファイル、2 つ目は元の .NEF 画像、3 つ目はイメージ コントロールに表示される画像です。

それらはすべて似ていることがわかります。ただし、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 にバグがあるようです。RGB ではなく BGR の順にピクセルをコピーします。

なぜ私がR&Bパートを切り替えなければならないのか分かる人はいますか? 他の提案はありますか?

とにかく、今はうまくいきます。これを理解するのに10時間以上かかりました.将来誰かがこれを必要とするかもしれません. それが役に立てば幸い。

ありがとう

于 2013-06-14T15:48:23.307 に答える