バックグラウンド:
私は、画像をレンダリングし、画像のメモリ位置を (ストライドなどと同様に) 返す外部 (管理されていない) API を使用しています。この API はまだ完全に開発されていないため、当面は動作をモックしようとしています。
仕事:
アンマネージ コードで作成されたイメージの一部からイメージを作成しようとしています。たとえば、画像の右半分のみを含む BitmapSource を作成したいと思います。
これをシミュレートするために、メモリ内にイメージを作成します。
Bitmap logo = Properties.Resources.test2;
BitmapData bmpData =
logo.LockBits(new System.Drawing.Rectangle(0, 0, 970, 844), System.Drawing.Imaging.ImageLockMode.ReadWrite, logo.PixelFormat);
これで、メモリ内の画像の開始点を取得できます
IntPtr startOfImage = bmpData.Scan0;
画像の右側を取得するために、私は失敗しました(画像の寸法が970 * 844で、Pixelformatが24ビットRGBであると仮定します):
IntPtr locationOfImage = bmpData.Scan0 += bmpData.Stride / 2 ;
BitmapSource source = BitmapImage.Create(485, 844, 96, 96, System.Windows.Media.PixelFormats.Rgb24, null, locationOfImage, 844 * bmpData.Stride / 2, bmpData.Stride / 2);
しかし、これは私に画像の右側を与える方法ではありません。何が欠けていますか?
ベストウィッシュ
ダニエル
編集:
最初の行だけストライドの半分をスキップしているため、これが画像の右側を返していないことは明らかです。常にバイトの一部をスキップしながら画像を作成することは何とか可能ですか (たとえば、行の一部をスキップする各行にスキップ値があります)?
明らかに、最初に必要なすべてのバイトを配列に読み込んで、IntPtr の代わりに渡すこともできますが、場所を直接渡すことができると便利です。