0

1- Windows CE では、C# で Bitmap オブジェクトを使用しています。

2- RGB565 形式、幅、高さの画像を表すバイト配列へのポインターをパラメーターとして期待する extern dll に C 関数があります。この関数は、このバイト配列を描画します。

そのため、Bitmap オブジェクトのバイト配列ポインターを渡す必要がありますが、このポインターを取得する実用的な方法を見つけることができます。1 つの方法は、メモリ ストリームなどを使用してこのビットマップをバイト配列に変換することですが、新しいバイト配列が作成されるため、ビットマップとバイト配列の両方のオブジェクトをメモリに保持しますが、それは必要ありません。使用可能なメモリが少ないため、新しいバイト配列を作成するのではなく、ビットマップ オブジェクトのバイト配列にアクセスする必要があります。

誰でも私を助けることができますか?

4

3 に答える 3

2

画像がビットマップである場合、次のようなことができます。

Rectangle area = (new Rectangle(0, 0, image.width, image.height));
BtimapData bitmapData = image.LockBits(area, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
stride = bitmapData.Stride;
IntPtr ptr = bitmapData.Scan0;

ビットマップのRGB値を別の配列にコピーしたくないことは理解していますが、それが最善の解決策です。配列は、Cコードで描画している間のみメモリに格納されます。私はWindowsProfessional6でも同様のアプローチを使用しましたが、多くのオーバーヘッドは発生しませんでした。利用可能な多くのFastBitmap実装があります。あなたはstackoverflowまたはこの実装でこの質問をチェックすることができます

于 2012-10-21T17:02:38.847 に答える
1

安全でないコードを使用して、ビットマップ データ ポインターを取得できます。

次のコードを使用します。

var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var bmpData =
    bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
    bmp.PixelFormat);

IntPtr ptr = bmpData.Scan0;

byte* bmpBytes = (byte*)ptr.ToPointer();

bmpあなたのBitmapオブジェクトはどこですか。

次に、反対のこともできます。

ptr = new IntPtr(b);

bmpData.Scan0 = ptr;
于 2012-10-21T16:56:12.890 に答える
0

「NikolaD」と「oxilumin」の反応のおかげで、問題を解決することができました。

RGB565を使用しているため、コードは次のとおりです。

imgMap.Image = new Bitmap(imgMap.Width, imgMap.Height, PixelFormat.Format16bppRgb565);
Rectangle area = (new Rectangle(0, 0, imgMap.Width, imgMap.Height));
BitmapData bitmapData = ((Bitmap)imgMap.Image).LockBits(area, ImageLockMode.ReadWrite, PixelFormat.Format16bppRgb565);
IntPtr ptrImg = bitmapData.Scan0;

ここで、imgMapはPictureBoxです

再度、感謝します

于 2012-11-28T12:31:22.110 に答える