Frage

Ich möchte in der Lage sein, eine große (etwa 20.000 x 20.000) Pixel erstellen Bitmap in einer C ++ MFC-Anwendung, eine CDC abgeleitete Klasse mit auf die Bitmap zu schreiben. Ich habe versucht, Speicher DCs, wie in der MSDN-Dokumentation beschrieben, aber diese erscheinen kompatibel mit dem aktuellen Bildschirmtreiber Größen beschränkt werden.

Ich bin derzeit einen Treiber Bitmapdruck die Arbeit zu tun, aber es ist extrem langsam und verbraucht sehr große Mengen an Zwischenlagerung aufgrund GDI Informationen Spooling.

Die Lösung ich suche nicht Metadateien oder Spooling, als das Modell einzubeziehen, die ich zu zeichn dauert viele Millionen von GDI zu machen aufruft.

Ich könnte eine Kluft verwenden und Ansatz über mehr Speicher DCs erobern, aber es scheint wie ein ziemlich cumborsome und unelegant Technik.

irgendwelche Gedanken?

War es hilfreich?

Lösung

CDC und CBitmap erscheint nur geräteabhängige Bitmaps zu unterstützen, könnten Sie mehr Glück Erstellung Ihrer Bitmap haben mit :: CreateDIBSection , dann eine CBitmap dem Anbringen. Die rohen GDI-Schnittstellen sind ein wenig ergraut, leider.

Sie werden wahrscheinlich nicht viel Glück mit 20.000 x 20.000 bei 32 BPP, zumindest in einer 32-Bit-Anwendung, wie etwa 1,5 GB Speicher bei herauskommt, aber ich habe einen gültigen HBITMAP mit 16 bpp zurück:

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));

Andere Tipps

Dies ist ungewöhnlich, da ich oft eine DC erstellt basierend auf dem Bildschirm, die für ein Bitmap-Bild verwendet wird, die viel größer ist als der Bildschirm - 3000 Pixel sowie in einigen Fällen - mit haupt keine Probleme. Haben Sie einige Beispiel-Code haben dieses Problem in Aktion?

In Anbetracht so eine große Bildauflösung, können Sie das Bild mit kompatibelen Bitmaps nicht erstellen.

Beispiel:

Pixeltiefe = 32 Bits = 4 Bytes pro Pixel

Pixelzahl = 20.000 * 20.000 = 400.000.000

Insgesamt Bytes = Pixelanzahl * 4 = 1.600.000.000 Bytes = 1.562.500 kb ~ = 1525 MB ~ = 1,5 GB

Ich bin zu spekulieren über die letzten Absichten, aber nehme an, Sie erstellen möchten, und ermöglichen Benutzern mit sehr detaillierten zoomt eine riesige Karte zu erkunden. Sie sollten eine benutzerdefinierte Bilddateiformat erstellen; Sie können innerhalb dieser Datei verschiedener Schichten, die Gitter von Bitmaps beispielsweise zur Beschleunigung Rendering setzen. Der Prozess machen kann GDI DIB oder GDI + verwenden Teilbilder zu erstellen und sie dann zusammen machen. Natürlich ist dies etwas experimentieren müssen / Optimierung des perfekte Benutzergefühl zu erreichen.

Glück

Um die Speicherauslastung zu halten innerhalb akzeptabler Grenzen, müssen Sie Ihre ‚Teile und Herrsche‘ verwenden Strategie. Es ist kein Hack, wenn sie umgesetzt richtig es ist eigentlich eine sehr elegante Art und Weise mit Bitmaps unbegrenzter Größe des Umgangs. Wenn Sie es richtig entwerfen, können Sie kombinieren die ‚nur machen / show Teil des Bildes‘, ‚machen das ganze Bild mit niedriger Auflösung für die On-Screen-Display‘ und ‚machen das Ganze zu einem On-Disk-Bitmap‘ -Ansätze in ein Motor und Schild Benutzer Ihres Codes (höchstwahrscheinlich selbst in zwei Wochen;)) aus den Einbauten. Ich arbeite an einem Produkt mit den gleichen Fragen:. Rendering (möglicherweise große) Karten entweder auf den Bildschirm oder in .bmp-Dateien

Wenn das Bild diese Auflösung zu sein hat - sagen, ein hallo-res-Scan einer x-ray - dann könnten Sie bei Schreiben von benutzerdefinierten Spooling-Routinen für sie aussehen wollen - 1,5 GB ist sehr teuer - auch für moderne Desktops <. / p>

Wenn es Vektor-basiert, dann können Sie bei SVG aussehen, als es Ansicht Ports unterstützt und die meisten können Sie in andere Formate zu machen. Ich benutze SVG JPG über Batik (Java), so ist es möglich, zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top