2011-01-13 12 views
1

私は、PDFドキュメントのページを「平坦化」するために使用しているアルゴリズムに問題があります。物理メモリではなくディスク上のCreateDibSection

HBITMAP hbmp = CreateDibSection(...); 
ThirdPartyBmpManipulation(hbmp, "C:\\file.pdf", 0); //renders page 0 in file.pdf 
void * hdib = ConvertBitmap(hbmp); //copy a Dib Section to a Dib 
DeleteObject(hbmp); //frees the HBitmap while the Dib is now in memory 

問題は、私は本当に大きなビットマップを持っていると私はにコピーするDIBを割り当てながら、いくつかのケースでは、私はメモリ内のHBITMAPを維持することはできませんです。

だから私は長時間の撮影ですが、何とかDibセクションをディスクに割り当てても、それにはHBITMAPがありますか? (ConvertBitmap関数と同じハンドルを使用)

+0

いい質問のようです。私は答えを知ることに興味があります。しかし、なぜ古いWindows APIを使っているのですか?それは本当に古いです。なぜGDI +を使用しないのですか? – Rafid

+0

@Promather GDI +はGDIのラッパーで、実際には遅くなります;-) –

+0

Hmmm ....私はあなたに同意しません。 GDI +は、Windows Vistaと7でグラフィックスアクセラレーションを使用し始めた全く新しいものです。私は正しいのですか、物事を混ぜるのですか?とにかく、たとえ速度が遅いとしても、ハードドライブからビットマップを読み書きすることを容易にするより良い構造を持つかもしれません。 – Rafid

答えて

1

障害モードとは何ですか?あなたは "物理的なメモリ"と言う:Windowsは仮想メモリを使用する、それはディスクにページする、あなたはパフォーマンスのヒットを超えて物理メモリを使い果たして心配する必要はありません。アドレス空間が不足している場合は、ディスクを使用すると手助けできない場合があります。

しかし、CreateDIBSectionは、CreateFileMappingで作成されたファイルマッピングに対してHANDLEを使用できます。機能の内部および関連するHBITMAP機能が十分にスマートな場合、その機能を活用してアドレス空間を使い果たすのを避けることができます。彼らが "スマート"の場合、彼らはMapViewOfFileを使って、必要に応じてファイルの比較的小さな「ウィンドウ」をプロセスのアドレス空間にマップします。

+0

私はアドレス空間を意味しました。私はCreateFileMappingが、ファイルの読み込みと同じくらい多くのスペースをメモリ内に確保すると思ったのですか? CreateFileMappingはwin32の2Gbの制限に含まれないと言っていますか? –

+0

CreateFileMapping自体はプロセスのアドレス空間に対して何もしません.MapViewOfFile [Ex]はそれを行います。ファイルの一部を一度にアドレス空間にマップすることは可能です。 'CreateDIBSection'と友人がマッピングに手を与えられたときにこれを行うのに十分スマートならば、この問題を避けることができます。ここでもまた保証はなく、私はこれらの関数の内部を知りません、私はそれが可能なインターフェースを与えられていることを知っています。 –

+0

私はあなたがこれを受け入れたという事実はうまくいったと思いますか? –

関連する問題