0

データ テンプレートでカスタマイズされたイメージ コントロール内の一連のイメージ フレームを表示するために、InteropBitmap のリストを使用しています。

私が探しているのは、画像のセットを単一の画像にエクスポートすることですが、間違った色の悪い/部分的な画像が得られます。

以下は、単一のイメージで InteropBitmap のセットを変換するために使用しているコード スニペットです。

 var firstInterop = this.InteropBitmapList[0]; // Get info from first frame, all other one are the same format.

  int width = firstInterop .PixelWidth;
            int height = firstInterop.PixelHeight;
            int bpp = firstInterop Format.BitsPerPixel;

            int stride = width * (bpp / 8);
            int count = this.InteropBitmapList.Count;

            byte[] buffer = new byte[stride * height * count];

            for (int i = 0; i < count; i++)
            {
                var wb = this.InteropBitmapList[i];
                wb.CopyPixels(buffer, stride, width * height * i);
            }

最後に、バッファー配列を使用して、GDI+ または wpf 機器を介して jpeg 画像を取得します。残念ながら、どちらの方法も期待どおりには機能しません。

私のコードに何か問題がありますか?

@@EDIT クレメンスの回答のおかげで、色だけを除いて正しい画像を取得できるようになりました(すべての色が変更されています)。この問題は、GDI+ を使用してイメージを作成しようとする場合にのみ当てはまります。代わりに、JpegBitmapEncoder として WPF susch を使用すると、すべて正常に動作します。

次のコード スニペットを使用すると、正しいイメージを実現できます。

byte[] buffer = MyFunc.GetBuffer();
// ...
    var bitmap = System.Windows.Media.Imaging.BitmapSource.Create(width, height, 300, 300,
       System.Windows.Media.PixelFormats.Rgb24, null, buffer, stride);
            System.IO.FileStream stream = new System.IO.FileStream("example.jpg", System.IO.FileMode.Create);
            JpegBitmapEncoder encoder = new JpegBitmapEncoder();

            encoder.QualityLevel = 100;

            encoder.Frames.Add(BitmapFrame.Create(bitmap));
            encoder.Save(stream);

代わりに、次のコードは間違った色の画像を返します (赤が青になるなど)。

byte[] buffer = MyFunc.GetBuffer(); 
// ...
IntPtr unmanagedPointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(buffer.Length);
System.Runtime.InteropServices.Marshal.Copy(buffer, 0, unmanagedPointer, buffer.Length);

System.Drawing.Imaging.PixelFormat format = System.Drawing.Imaging.PixelFormat.Format24bppRgb (the equivalent of WPF format..)

System.Drawing.Image myImg = new System.Drawing.Bitmap(Width, Height, stride, format, unmanagedPointer);

myImg.Save("example.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

System.Drawing クラスを使用すると、なぜ機能しないのかわかりません。

4

1 に答える 1