2016-04-22 14 views
-1

Ich habe eine Bitmap mit CreateDIBSection erstellt und angegeben .biWidth = 100; .biHeight = 100 wie dieser Pseudo-Code:Bitmap-Größe ändern, ohne eine neue Bitmap zu erstellen

pBitmapInfo->bmiHeader.biWidth = 100; 
pBitmapInfo->bmiHeader.biHeight = 100; 
.... 
CreateDIBSection(DibDC, pBitmapInfo, DIB_RGB_COLORS, 0, 0, 0); 

Später mag ich diese Bitmap wieder zu verwenden, sondern nur die zu 300x100 Bitmap-Größe zu ändern (und das alte Bild löschen kann, weil ich es nicht mehr benötigen). Viele sagen, dass ich eine neue Bitmap mit neuer Größe erstellen und die alte Bitmap löschen muss. Aber ich habe irgendwie erwartet, dass wir die alte Bitmap wiederverwenden können. Ich möchte kein neues Bitmap neu erstellen, da es eine langsame Leistung verursacht, während ich es mehrmals wiederholen muss. Gibt es eine Möglichkeit, die Bitmap-Größe zu ändern, ohne eine neue Bitmap neu zu erstellen?

+0

Wenn Sie die Bitmap in zwei Größen benötigen, würde ich zwei Bitmaps erstellen. Die Größenänderung sieht wahrscheinlich schlecht aus. Sie müssen nichts wiederholt erstellen, lassen Sie einfach jedes Bitmap "leben", solange es benötigt wird. –

+0

Welche Umgebung verwenden Sie? Sicher nicht alle von VB/C/C++/Delphi .... Ich würde vorschlagen, alle diese Tags zu löschen und einfach "WinAPI" hinzufügen. – Johan

+0

Wie Strings sind Bitmaps unveränderlich. Einmal erstellt, können sie nicht geändert werden. Sie können jedoch nur einen Teil einer Bitmap anzeigen oder mit "StretchBlt" strecken. – IInspectable

Antwort

0

Wenn Sie sich Sorgen um die Leistung machen, ist es in der Tat keine gute Idee, weiterhin Bitmaps zu zerstören und zu erstellen.

Es gibt jedoch eine einfachere Lösung. Erstellen Sie einfach einen Pool von Bitmaps in vordefinierten Größen und verwenden Sie Bitmaps aus dem Pool nach Bedarf.

Wenn Sie eine lange gelebt DC haben, können Sie verwenden:

hBitmap100x100 = CreateCompatibleBitmap(MyDC, 100,100); 
hBitmap300x300 = CreateCompatibleBitmap(MyDC, 300,300); 

Wenn Sie ständig ändern DCs dann

hBitmap100x100 = CreateDIBSection(DibDC, pBitmapInfo100x100, DIB_RGB_COLORS, null, 0, 0); 
hBitmap300x300 = CreateDIBSection(DibDC, pBitmapInfo100x100, DIB_RGB_COLORS, null, 0, 0); 

Nur ein DIB-Abschnitt verwenden halten diese immer und immer wiederverwendet.
Sie können sogar ein Dutzend von ihnen in einem Array haben, wenn Sie möchten.
Sie erstellen sie beim Programmstart und entsorgen sie, wenn Sie fertig sind.

+0

'MyDC' ist eine temporäre Ressource, die sich oft während der Ausführung ändert (und manchmal gar nicht existiert); Diese Bitmaps müssten DIB-Abschnitte sein, nicht kompatible Bitmaps. – andlabs

+0

Vielen Dank Johan, ich bin sehr dankbar für diese alternative Methode. Ich habe vorläufig getestet und festgestellt, dass diese Methode meine Leistung deutlich erhöht. Ich mache noch ein paar Tests, bevor ich diese Antwort als die beste schreibe. – DucFabulous

Verwandte Themen