1

CDC派生クラスを使用してビットマップに書き込むことにより、C ++ MFCアプリケーションで大きな(たとえば20,000 x 20,000)ピクセルのビットマップを作成できるようにしたいと思います。MSDNのドキュメントで説明されているようにメモリDCを使用しようとしましたが、これらは現在のディスプレイドライバと互換性のあるサイズに制限されているようです。

私は現在、ビットマップ印刷ドライバーを使用して作業を行っていますが、GDI情報をスプールするため、非常に低速で、非常に大量の中間ストレージを使用します。

私が描いているモデルはレンダリングに何百万ものGDI呼び出しを必要とするため、私が探しているソリューションにはメタファイルやスプーリングは含まれていません。

複数のメモリDCを介して分割統治法を使用することもできますが、それはかなり面倒でエレガントでない手法のようです。

何かご意見は?

4

5 に答える 5

2

CDCとCBitmapは、デバイスに依存するビットマップのみをサポートしているように見えます。 :: CreateDIBSectionを使用してビットマップを作成し、それにCBitmapをアタッチする方が幸運かもしれません。残念ながら、生のGDIインターフェースは少し厄介です。

少なくとも32ビットアプリケーションでは、約1.5 GBのメモリで出力されるため、32BPPで20,000x 20,000を使用することはおそらくあまりありませんが、16bppで有効なHBITMAPを取得しました。

BITMAPINFOHEADER bmi = { sizeof(bmi) };
bmi.biWidth = 20000;
bmi.biHeight = 20000;
bmi.biPlanes = 1;
bmi.biBitCount = 16;
HDC hdc = CreateCompatibleDC(NULL);
BYTE* pbData = 0;
HBITMAP hbm = CreateDIBSection(hdc, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, (void**)&pbData, NULL, 0);
DeleteObject(SelectObject(hdc, hbm));
于 2008-09-26T07:27:46.467 に答える
1

このような大きな画像解像度を考慮すると、互換性のあるビットマップを使用して画像を作成することはできません。

例:

ピクセル深度=32ビット=ピクセルあたり4バイト

ピクセル数=20.000* 20.000 = 400.000.000

合計バイト数=ピクセル数*4=1.600.000.000バイト=1.562.500kb〜= 1525 MB〜= 1.5GB

私は最終的な意図について推測していますが、ユーザーが非常に詳細なズームで巨大な地図を作成して探索できるようにしたいとします。カスタム画像ファイル形式を作成する必要があります。たとえば、レンダリングを高速化するために、ビットマップのグリッドを含むさまざまなレイヤーをそのファイル内に配置できます。レンダリングプロセスでは、GDIDIBまたはGDI+を使用して部分的な画像を作成し、それらを一緒にレンダリングできます。もちろん、これには、完璧なユーザー感覚に到達するための実験/最適化が必要です。

幸運を

于 2008-09-26T07:41:44.357 に答える
1

これは珍しいことです。画面よりもはるかに大きいビットマップイメージ(3000ピクセルプラス場合によっては)に使用される画面に基づいてDCを作成することがよくあり、まったく問題はありませんでした。この問題の実際を示すサンプルコードはありますか?

于 2008-09-26T07:22:01.253 に答える
1

メモリ使用量を許容範囲内に保つには、「分割統治」戦略を使用する必要があります。これはハックではありません。正しく実装されていれば、実際には無制限のサイズのビットマップを処理する非常に洗練された方法です。正しく設計すれば、「画像の一部のみをレンダリング/表示する」、「画面上に表示するために画像全体を低解像度でレンダリングする」、「すべてをディスク上のビットマップにレンダリングする」アプローチを組み合わせることができます。 1 つのエンジンを使用して、コードのユーザーを (おそらく 2 週間以内に ;)) 内部から保護します。同じ問題を抱えた製品に取り組んでいます。レンダリング (潜在的に大きい) マップが画面または .bmp ファイルにマップされます。

于 2008-09-26T08:19:24.500 に答える
0

画像がこの解像度である必要がある場合(たとえば、X線の高解像度スキャン)、そのためのカスタムスプーリングルーチンの作成を検討することをお勧めします-1.5GBは非常に高価です-最新のデスクトップでも。

ベクターベースの場合は、ビューポートをサポートし、ほとんどの場合、他の形式にレンダリングできるSVGを見ることができます。私はSVGをBatik(java)経由でJPGに使用しているので、それが可能です。

于 2008-09-26T08:05:40.353 に答える