TBitmap::HandleType



  • 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 folgendes

    unsigned 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? 🙂



  • Hallo Zusammen,
    Ich will auf einem Image die Ihre Picture aus dem Clipboard() (als Metafile) bekommt zeichnen, dies geht leider nicht weil BCB will ein Bitmap-Format haben, ist es möglich diesen Metafile-Format (direkt aus dem Clipboard() oder in den Image) in einem Bitmap zu wandeln? ich habe vergeblich den ganzen Tag heute versucht, aber ohne Erfolg.
    Gruß
    C++:Hoby



  • Hallo,

    Du kannst natürlich auch ein Metafile in ein Bitmap wandeln aber es wäre doch sicher einfacher mit TCanvas::Draw() das Metafile direkt zu zeichnen.

    Ciao


Anmelden zum Antworten