TBitmap::HandleType
-
Hab grad rausgefunden, daß es total easy geht, den Umgang mit Bildern zu beschleunigen. Höhere Zoomstufen können angezeigt werden. Die Refreshraten sind wesentlich kürzer, daher laufen auch Scrollbewegungen viel glatter. Das Speichern scheint unabhängig von der gewählten HandleType zu erfolgen (Test). - Das scheint weitgehend unbekannt zu sein, denn in einschlägige Threads flossen keinerlei spezifische Hinweise ein.
// Standard
Image->Picture->Bitmap->HandleType = 0;// Besser
Image->Picture->Bitmap->HandleType = 1;Ole, ich nehm gem. Hilfe an, ich arbeite speicherintern mit DDB. Aber:
// geht auch
Image->Picture->Bitmap->HandleType = 2;Daher die Frage: Was tu ich da genau? Existiert eine Tabelle, in der die HandleTypen aufgelistet sind? Oder weiß es jemand?
-
Hallo,
Hier mal ein kleiner Ausschnitt aus der BCB Hilfe
Die Eigenschaft HandleType gibt ab, ob es sich bei dem Bitmap um ein DDB (Device Dependent Bitmap) oder ein DIB (Device Independent Bitmap) handelt.
enum TBitmapHandleType {bmDIB, bmDDB};
__property TBitmapHandleType HandleType = {read=GetHandleType, write=SetHandleType, nodefault};Beschreibung
Mit Hilfe von HandleType kann der Typ des Bitmaps ermittelt oder geändert werden. DDBs lassen sich meist schneller auf dem Bildschirm darstellen, werden aber in einem gerätespezifischen Format im Arbeitsspeicher gespeichert. DIBs werden im Arbeitsspeicher in einem Standardformat gespeichert, das von allen Geräten (einschließlich Druckern) unterstützt wird.
Also ist Type 1 bmDDB
Ciao
-
Ach, bin ein Schaf! Hätte mal das Ergebnis testen sollen, wenn ich als HandleType = 2 angeb. Es ist 1.
enum TBitmapHandleType {bmDIB, bmDDB};
hab ich in der Hilfe gar nicht (BCB3). - Viel zu oft fehlen diese wichtigen Infos. Die Orientierung ist dann mitunter nicht möglich oder sehr erschwert.
Da dank ich dir sehr, @Braunstein, das hilft weiter.
Aber kein Vorteil ohne Pferdefuß. Clipboard kann das Format scheinbar gar nicht verarbeiten. Also setz ich HandleType vor dem Kopieren zurück auf 0. Das nützt aber nichts. Im Clipboard liegt trotzdem ein unbrauchbares Format vor. Weiß jemand Rat, wie ich nun ein brauchbares Format ins Clipboard bekomme?
-
Hallo noch mal,
Das blosse setzen des Flags wird wohl nicht reichen.
Schau mal in der Hilfe nach GetDIB
-
Hab die Syntax so gut ich konnte aufgebaut. Der Compiler akzeptiert es so, doch beim Kopierversuch bekomm ich die Meldung: "Bitmap ist ungültig". Im Prinzip müßte ich inzwischen alle Variationen durchprobiert haben. Wie muß ich richtig schreiben?
int InfoHeaderSize, ImageSize; GetDIBSizes(MarkBase->Picture->Graphic,InfoHeaderSize,ImageSize); int BitmapInfo = InfoHeaderSize; GetDIB(MarkBase->Picture->Graphic, MarkBase->Picture->Graphic->Palette,&BitmapInfo,&ImageSize); MarkBase->Picture->Bitmap->HandleType = bmDIB; Clipboard()->Assign(MarkBase->Picture);
-
Hallo,
Der Syntax scheint nicht korrekt zu sein, denn in der Borland Hilfe steht:
extern PACKAGE void __fastcall GetDIBSizes(HBITMAP Bitmap, int &InfoHeaderSize, int &ImageSize);
Beschreibung
Mit GetDIBSizes kann der Speicherbedarf für die Konvertierung eines geräteabhängigen Bitmaps in ein geräteunabhängiges Bitmap (DIB) ermittelt werden. Das Handle auf ein geräteabhängiges Bitmap wird als Parameter Bitmap übergeben. GetDIBSizes liefert die Größe des Info-Headers und des Bildes des entsprechenden DIB als Parameter InfoHeaderSize bzw. ImageSize.
Mit GetDIBSizes ermitteln Sie, wieviel Speicher vor dem Aufruf von GetDIB reserviert werden muß, um ein geräteabhängiges Bitmap in ein geräteunabhängiges zu konvertieren.
Das bedeutet, der erste Parameter muss ein Handle auf ein Bitmap sein, du übergibst einen Pointer auf TGraphic (auch bei GetDIBSizes).
Der zweite und dritte Parameter scheinen ok zu sein.
Der vierte Parameter ist ein void Pointer, der auf das neue Bitmap zeigen sollte, welches du vorher in der richtigen Grösse (ImageSize), erstellen musst.Ciao
-
Hab die Graphic-Pointer jetzt auf Bitmap abgändert. Ansonsten kann ich nichts mehr ändern, ohne einen Konvertierungsfehler zu erhalten. Die Referenzen werden genau an den 2 Positionen erwartet. Es wird aber weiterhin ein unbrauchbares Bitmap kopiert. Der Fehler tritt beim Verlassen von GetDIBSizes auf.
Die Bitmap ist übrigens vorher mit
MarkBase->Canvas->CopyRect(MarkBase->ClientRect,Image->Canvas,BRect);
erstellt. Sie wird vom darunterliegenden TImage kopiert.
'ne andere Syntax könnte ich aus der Hilfe aber nicht ableiten. Und doch mach ich einen groben Fehler schon in der ersten Zeile.
-
Versuchs mal damit
int InfoHeaderSize, ImageSize; GetDIBSizes(MarkBase->Picture->Bitmap->Handle,InfoHeaderSize,ImageSize);
-
Leider, das Bitmap->Handle wollte auch nicht gehen. Hab auch noch mal die Reihenfolge der parameter und die Zuordnungen vertauscht. Alles negatig. - An den Helpseiten merxt man deutlichm, daß Freitag, später, später Nachmittag war.
Ich bin zu doof, oder eine klare Zuordnung ist nicht möglich. Wenn wenigstens das Expirimenterln was bringen würde...
-
Hallo,
Wie fügst du denn dein Bitmap in die Zwischenablage ein? Vielleicht funktioniert das ja nicht. Zeig mal ein bischen Code
Sorry Ich hab oben grad gesehen wie du das machst.
Versuch mal folgendesunsigned int DataHandle; HPALETTE APalette; unsigned short MyFormat; try { MarkBase->Picture->Bitmap->SaveToClipboardFormat(MyFormat,DataHandle,APalette); Clipboard()->SetAsHandle(MyFormat,DataHandle); } catch(...) { // irgendwas }[ Dieser Beitrag wurde am 18.03.2003 um 16:25 Uhr von Braunstein editiert. ]
[ Dieser Beitrag wurde am 18.03.2003 um 16:26 Uhr von Braunstein editiert. ]
-
Jau, das eigene ClipboardFormat klappt. Jetzt hab ich aber Nachteile beim Pasten. Ich muß dieses Format einfügen können. Hab es mit dem Beispiel aus der Hilfe versucht, klappt nicht.
Außerdem, was bringt es, in einem eigenen Format zu Pasten? Andere Anwendungen können damit nichts anfangen.
Aber es hätte ja erst mal eine Möglichkeit sein können, mit der erstellten HandleType doch arbeiten zu können. Das klappt leider nicht. An meiner Syntax ist was faul.
Ich mach das jetzt so, bis es klappt: Ich verwende den alten Code und setz das DDB-Flag für MarkBase nicht. Es ist schon ein großer Vorteil, anwendungsintern mit einem schnellen DDB-Handle arbeiten zu können.
Schlecht sieht's nur aus, wenn ich ICO oder (eher nicht wichtig) WMF laden will. Das klappt bei DDB nicht bzw. wird beim Handling mit dem TImage wieder gelöscht.
Also entweder, ich bekomm den Wechsel hin, oder ich muß für ICO und WMF ein zweites TImage mit DIB-Flag bereit haben. Wär eigentlich auch kein Problem. Lieber wär mir natürlich die Möglichkeit, wechseln zu können.
-
Hat keinen Wert, ich kann nicht auf die Rückwandlung des BitMapHandle verzichten. Verschiedene Functionen wie Bild heller, dunkler, Graustufen... werden zwar noch fehlerfrei durchlaufen, aber nicht mehr ausgeführt. Das Arbeiten mit Speicherbitmaps hilft nicht, sie übernehmen offenbar das Handle.
Das wär die Umwandlungsfunction:
void __fastcall TPixi::BitmapHandleType(TObject *Sender) { if (Image->Picture != 0) Image->Picture->Bitmap->HandleType = bmDDB; }Die Rückverwandlung hab ich weiter probiert, aber keine Chance. Hat inzwischen jemand Erfahrung sammeln können und kann mir ggf. weiterhelfen? Bzw. wie ist die Syntax in der Hilfe richtig umzusetzen? Ich komm hier nicht weiter.
-
Haaaalt, hiergeblieben. Zumindest bis Montag solltest du noch sichtbar sein.

-
Hallo,
Was genau funktioniert denn nicht. Zur Umwandlung von dib nach ddb sieh mal in die Hilfe zu:
*
CreateDIBitmap
The CreateDIBitmap function creates a device-dependent bitmap (DDB) from a device-independent bitmap (DIB) and, optionally, sets the bitmap bits.HBITMAP CreateDIBitmap(
HDC hdc, // handle to device context
CONST BITMAPINFOHEADER *lpbmih, // pointer to bitmap size and
// format data
DWORD fdwInit, // initialization flag
CONST VOID *lpbInit, // pointer to initialization data
CONST BITMAPINFO *lpbmi, // pointer to bitmap color-format data
UINT fuUsage // color-data usage
);
*Ciao
[ Dieser Beitrag wurde am 19.05.2003 um 14:54 Uhr von Braunstein editiert. ]
-
Die Umwandlung ist kein Problem. Den Code hatte ich im Beitrag darüber noch mal gepostet. Aber ich bekomm die Rückverwandlung nicht hin. Wir hatten ja zu mehreren ergebnislos geknobelt. Bin inzwischen auch nicht weitergekommen.
-
und was passiert, wenn du ein neues dib Bitmap erzeugst und dann dein altes reinkopierst. Das müsste doch gehen, oder ?
-
Dann ist die Zwischenablage damit zufrieden. Andere Anwendungen können auch auf das Format zurückgreifen.
Functionen wie Bild heller, dunkler, Graustufen werden aber nicht mehr bildwirksam ausgeführt. Also scheinen doch Informationen übergeben zu werden.
Wie es bis jetzt aussieht, komm ich um die Rückverwandlung in DIB nicht drumrum.
-
*lila*, mein letzter Versuch, dann muß der Thread wieder Schlafen gehen, bis zufällig irgendjemand irgendwann wieder die Lampe reibt.

Bei so vielen erfahrenen Programmierern in der Runde + die total optimierte und bombastisch starke Hilfe im BCB6 :p sollte rein theoretisch doch jemand in der lage sein,
DDB wieder in DIB
zurückzuverwandeln?
Das dürften nur ganz wenige Codezeilen sein. Aber wie es nun mal des Lernteufels brauch ist, genau diese Syntax bekomm ich nicht zusammen. Wer kann, wer mag Idee oder Hilfe stiften? Laßt die Mühen des gepeinigten Fragers und vor allem die Mühen der unermüdlichen Helpers nicht umsonst gewesen sein.

-
Hallo mal wieder,
Du müsstest dich mal in der MSDN umschauen. Da findest du bestimmt etwas. Vielleicht hilft dir CreateDIBSection weiter. Ich habs jetzt allerdings nicht ausprobiert.
Ciao
-
Ich hab jetzt hier nicht alles gelesen/verfolgt, aber warum legst Du nicht 2 Kopien Deines Bitmaps an, eines DDB und eines DIB. Dann brauchste nix zurückverwandeln, höchsten zurück kopieren

-
CreateDIBSection hat mich nicht weitergebracht, @Braunstein. Leider, nur die DIB-Seite, keine Umwandlung.
@Peter, das dürfte nicht möglich sein oder gar nichts bringen. Ich verwende das DDB wegen des flotten Handlings mit dem TImage. Anzeige hoher Vergrößerungen, flottes Malen, flottes Scrollen. Wenn ich zB. die DIB-Referenz unter dem TImage mit dem DDB-Handle mitlaufen laß, muß ich beide synchron schalten. Also wartet mein schnelles Arbeits-Image ständig auf das viel langsamere DIB-Image. Alle Berechnungen und Bewgungen müssen darin ja aktuell durchgeführt werden.
Total scheitern tut das ganze dann am Zoomfaktor. Die Arbeitsvergrößerung von 1000% kann bei DIB allenfalls für sehr kleine Bilder erreicht werden. Größere Bilder werden schon ab 300 oder 400% nicht mehr angezeigt. Bei DDB kann ich problemlos 10 MB "schwere" Bilder auf 1000% bringen und flott darin arbeiten.
Leider, so gut es gemeint ist, keine Chance. Ich brauch wirklich die Umwandlung, oder ich muß mit faulen Tricks (sinnlose Functionsaufrufe) arbeiten, um einige Functionen der App überhaupt nutzen zu können.
Freaks der bildenden Künste, nur testhalber mal ein
Image->Picture->Bitmap->HandleType = bmDDB;,
und ihr erlebt ein völlig neues Arbeitsgefühl. Wer DDB kennt, will es sicher nicht mehr missen. Die Knobelkur, es wieder zurückwandeln zu können, sollte sich jederzeit lohnen können. Wer macht mit?