データ テンプレートでカスタマイズされたイメージ コントロール内の一連のイメージ フレームを表示するために、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 クラスを使用すると、なぜ機能しないのかわかりません。