3

私は 64 ビットのビットマップを作成し、Graphics オブジェクトを使用してラップし、その上に描画しています。問題は Gdiplus の Color クラスが 32 ビット (各コンポーネントは iemax 255 のバイトのみ) であるため、gdiplus を使用して 64 ビット イメージを描画するにはどうすればよいですか? 例えば

Bitmap bmp(100, 100, PixelFormat64bppARGB);

Graphics g(&bmp);
//how do I draw a red line now, if i use Color(255,0,0) it comes as almost dark black red
4

3 に答える 3

2

Gdiplus は 64 ビット操作をサポートしていないようです。Gdiplus メソッドを引き続き使用できる簡単な方法は、画像を 2 つの 32 ビット画像に分割し、それらを個別に操作することです。

ARGB チャネルを AARR と GGBB に分割するか、ARGB の下位ビットと上位ビットを持つ 2 つの 32 ビット イメージを使用することができます。

どちらのバリアントでも、ラッピング関数を記述するか、各呼び出しを次のように 2 つの部分に分割する必要があります。

// This is what you want to do (ARGB, 16 bit per channel)
// g.DrawLine(new Pen(Color(0, 65535, 1024, 31), 1, 0, 0, 100, 100);

// AARR GGBB variant
gAARR.DrawLine(new Pen(Color(0,0,255,255), 1, 0, 0, 100, 100);
gGGBB.DrawLine(new Pen(Color(4,0,0,31), 1, 0, 0, 100, 100);

// ARGBhigh ARGBlow variant
gHigh.DrawLine(new Pen(Color(0,255,4,0), 1, 0, 0, 100, 100);
gLow.DrawLine(new Pen(Color(0,255,0,31), 1, 0, 0, 100, 100);

ここでは Color(A,R,G,B) の順序を使用しましたが、よくわかりません。MSDN のドキュメントによると、代わりにこれを Color(R,G,B,A) に変更する必要があります。アルファ チャネルが必要ない場合は、引き続き Color(R,G,B) を使用できるはずなので、highlow バリアントを優先する必要があります。

結果を表示または保存するには、2 つのバッファをマージする必要があります。

于 2009-03-07T10:24:22.927 に答える
1

MSDN - Image Pixel Format Constantsによるとできません:

備考

PixelFormat48bppRGBPixelFormat64bppARGB、および PixelFormat64bppPARGB色成分 (チャネル) ごとに 16 ビットを使用します。Microsoft Windows GDI+ バージョン 1.0 は、チャネルあたり 16 ビットのイメージを読み取ることができますが、そのようなイメージは、処理、表示、および保存のためにチャネルあたり 8 ビットの形式に変換されます。

于 2010-01-30T11:00:14.013 に答える
0

この Bitmap コンストラクターを使用して、ピクセル形式を設定できます。

public:
Bitmap(
    int width, 
    int height, 
    PixelFormat format
)

編集: 32 ビット色のみをサポートするため、Color クラスを使用することはできません (私が思うに)。ただし、Bitmap で LockBits を呼び出して、手動でループすることはできます。

于 2009-03-07T10:16:42.977 に答える