kein Pointer auf Bitmap zu bekommen



  • @hustbaer

    na ja das bei SetBitmap die daten wirklich kopiert werden das bezweifel ich jetzt mal, genau so wie wenn man von einem CString eine Kopie macht, die Daten nicht wirklich kopiert werden solange sich einer von beiden strings nicht ändert, also solange beide strings gleich sind gibt es auch nur einen Puffer, oder kannst du da was anderes beweisen?



  • @CTecS:
    Freund. Bezweifel was du willst, ich muss dir gar nix beweisen.

    Vermutlich bezweifelst du auch dass memcpy die Daten wirklich kopiert, weil das könnte es ja auch wie CString machen.


  • Mod

    CTecS schrieb:

    na ja das bei SetBitmap die daten wirklich kopiert werden das bezweifel ich jetzt mal

    SetBitmapBits koopiert die Daten. Da hat hustbaer recht. Was soll es auch anderes tun? Du hast ja kein verwaltetes Objekt, sondern einen Zeiger auf die Bits...

    CreateDIBSection führt dagegen so etwas wie ein Speichermapping durch... Es ist wirklich entscheidend schneller, besonders bei großen Bitmaps.

    Der Vergleich mit CString hinkt kräftig. Ein CString Objekt wurde durch die CString Klasse selbst erzeugt. Nur deshalb ist ein COW möglich. Der Zeiger den Du an SetBitmapBits übergibst darfst Du sofort danach wegschmeißen oder überschreiben... Würdest Du so etwas wie ein Objekt erzeugen (GDI-Handle) oder gäbe es so etwas wie GDI-Speicher, wäre das ja evtl. denkbar, aber so was kennt GDI nicht.



  • Man kann jedenfalls zwischen dem Übergeben des Arrays an SetBitmapBits und der Blit-Operation, ohne den Umweg über irgendwelche Klassenbibliotheken/Makros usw. zu gehen, mit *(pBilddaten+i)=... wild in das array schreiben, ohne dass das Konsequenzen für die Anzeige hat. Spricht eher dafür, dass wirklich kopiert wird, wovon ich jetzt erstmal ausgehe. Das Bitmap ist im 32BPP-Format ohne die momentane 2:1 Verkleinerung 5MB groß. Denke schon, dass das sinnvoll ist den Kopierschritt zu sparen.
    Ich hänge aber irgendwie fest.

    Ich fasse mal die SetBitmapBits-Version (die funktioniert) in Stichpunkten zusammen:
    in der ::OnDraw-Methode der View-Klasse eines SDI mach ich der Reihe nach folgendes
    1. memory DC erzeugen mit speichDC.CreateCompatibleDC(NULL)
    2. ein BITMAP str_bitmap deklarieren und mit Werten "ausfüllen"
    3. CBitmap deklarieren und Cvbitmap->CreateBitmapIndirect(&str_bitmap);
    4. speichDC.SelectObject(Cvbitmap)
    5. Daten in pKopierArray (32BPP BYTE-array) schreiben.
    6. Cvbitmap->SetBitmapBits(4*640*512,pKopierArray);
    7. pDC->SelectObject(Cvbitmap);
    8. pDC->BitBlt(30, 30, 640, 512, &speichDC, 0, 0, SRCCOPY);
    9. Zurückselektieren, array deleten usw.

    Das will ich jetzt umstellen.
    Also erst CreateDIBSection(.....,&pBitmapDaten,.....), dann in obigem Ablauf bei 5. pKopierArray durch pBitmapDaten ersetzen und dann?

    Wenn ich irgendwas verstanden habe, dann fällt Punkt 6 weg.
    1. wird weiter benötigt und speichDC.m_hDC wird später an CreateDIBSection übergeben.
    aus 2 wird dann ein entsprechender Punkt mit BITMAPINFO-struct. Da wird's schon problematisch. Ich will keine Paletten benutzen und 32BPP. Laut der onlinehilfe zu BITMAPINFOHEADER, Abschnitt biBitCount soll der bmiColors-member von BITMAPINFO dann NULL sein. Das ist aber ein array und das macht sich irgendwie nicht gut auf der linken Seite eines Zuweisungsoperators. Kann man das dann einfach uninitialisiert lassen?
    3. sollte eigentlich auch rausfallen, da CreateDIBSection das DIB so erzeugt "that applications can write to directly."
    Bei 4. kommt dann CreateDIBSection
    5. dann das schreiben der Daten. (hab schon im Debugger reingeschaut, Daten sind drin)
    6. und 7. fallen weg
    bei 8. kommt dann
    nSetDIBitsRueck = SetDIBitsToDevice(pDC->m_hDC,30, 30, 640, 512, 0,511,0,512, &pBitmapDaten, &str_bitmapinfo, DIB_RGB_COLORS);

    Rückgabewert ist immer 0 und es wird nichts gezeichnet.

    Vielleicht sieht ja einer den Denkfehler. An Sonsten lege ich das Thema Optimierung erstmal zu den Akten und mach mal mit den eigentlichen Messalgorithmen weiter.



  • sorry wenn ich jemanden auf die Füße getreten habe, dann führt eben CreateDIBSection sowas wie ein Speichermapping aus und SetBitmapBits kopiert, ist das halt so wieder was gelernt


Anmelden zum Antworten