質問

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

現在、ジョブの実行にビットマッププリントドライバーを使用していますが、GDI情報をスプールしているため、非常に遅く、非常に大量の中間ストレージを使用します。

私が描いているモデルは何百万ものGDI呼び出しをレンダリングするので、探しているソリューションはメタファイルやスプーリングを含むべきではありません。

複数のメモリDCを介して分割統治アプローチを使用することもできますが、かなり面倒で洗練されていない手法のようです。

何か考えがありますか

役に立ちましたか?

解決

CDCおよびCBitmapは、デバイス依存のビットマップのみをサポートしているようです。 :: CreateDIBSection にCBitmapを添付します。生のGDIインターフェースは少し残念ですが、残念ながら。

少なくとも32ビットアプリケーションでは、32 BPPで20,000 x 20,000を使用する場合、おそらく約1.5 GBのメモリで十分な運がありませんが、16 bppで有効な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));

他のヒント

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

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

例:

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

ピクセル数= 20.000 * 20.000 = 400.000.000

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

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

幸運

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

画像をこの解像度にする必要がある場合(X線の高解像度スキャンなど)、そのためのカスタムスプールルーチンの作成を検討したい場合があります-1.5 GBは非常に高価です-現代のデスクトップでも

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top