Bitmaps & Regions spiegeln



  • hallo,

    möchte gerne herausfinden, wie man am einfachsten eingeladene Bitmaps spiegeln kann...
    ich hab mal mit StretchBlt usw. rumgefummelt, aber werde irgendwie nich arg schlau dabei...
    es heisst die Breite vom source und destination müssen sich unterscheiden, naja aber ka. wie das gehen soll, vielleicht mach ich irgendwas mit den parametern falsch

    darüberhinaus will ich dann die für die Bitmap verwendete Region auch spiegeln..
    ich hab erst versucht, die bitmap zu spiegeln und dann aus der ne neue Region zu erstellen, aber vielleicht geht das ja auch einfacher ?

    mfg haMMer



  • Original erstellt von Hammer:
    darüberhinaus will ich dann die für die Bitmap verwendete Region auch spiegeln..

    Ich gehe davon aus, dass du die Region für SetWindowRgn() brauchst. Schau dir da mal den ersten Parameter an.



  • Wenn du zum Beispiel bisher dein Bitmap (100x50px) so zeichnest:

    BitBlt(hdc, 0, 0, 100, 50, hdcBitmap, 0, 0, SRCCOPY);
    

    dann sieht der entsprechende StretchBlt-Aufruf ja so aus:

    StretchBlt(
      hdc,      // handle to destination DC
      0,        // x-coord of destination upper-left corner
      0,        // y-coord of destination upper-left corner
      100,      // width of destination rectangle
      50,       // height of destination rectangle
      hdcBitmap,    // handle to source DC
      0,        // x-coord of source upper-left corner
      0,        // y-coord of source upper-left corner
      100,      // width of source rectangle
      50,       // height of source rectangle
      SRCCOPY   // raster operation code
    );
    

    mit einer kleinen Änderung wird das ganze um die Y-Schse gespiegelt:

    StretchBlt(
      hdc,      // handle to destination DC
      0,        // x-coord of destination upper-left corner
      0,        // y-coord of destination upper-left corner
      100,      // width of destination rectangle
      50,       // height of destination rectangle
      hdcBitmap,    // handle to source DC
      100,      // x-coord of source upper-left corner
      0,        // y-coord of source upper-left corner
      -100,     // width of source rectangle
      50,       // height of source rectangle
      SRCCOPY   // raster operation code
    );
    

    entsprechend geht es mit der X-Achse. Die Region könntest du dann neu erstellen.



  • hmm klingt gut ! 😉

    wirds gleich mal testen



  • re

    so, also die Bitmaps spiegeln hab ich hinbekommen !
    nur die Regions spiegeln, das krieg ich noch nich hin..

    ich habs probiert mit StretchBlt und danach nochmal neu ScanRegion und es dann als neue RGNDATA abzulegen... aber das macht er nich

    die Funtionen StretchBlt oder BitBlt zeichnen ja nur die Bitmap, aber durch
    StretchBlt kann ich ja nich die Bitmap intern spiegeln...

    also ich vermute, dass ich in der ScanRegion funktion, die mir paranoiac
    gegeben hat, rumpfuschen muss... d.h. nochmal nen bool parameter einbauen, ob
    die region gespiegelt eingescannt werden soll oder nich, sozusagen

    oder hat jemand ne andere idee ?

    mfg haMMer



  • Scanne doch das gespiegelte Bitmap. 😕 Dazu solltest du aber jetzt eine andere Funktion benutzen. In meiner Unit "Regions", die du auf meiner Homepage unter "WinAPI" findest, befindet sich eine Funktion "BitmapToRegion()", die um einiges schneller ist als die von Paranoiac.

    [ Dieser Beitrag wurde am 12.03.2003 um 23:49 Uhr von WebFritzi editiert. ]



  • das schnall ich net
    wenn ich StretchBlt mach, zeichnet er die bitmap ja nur gespiegelt, aber
    er spiegelt die ja nich intern, so dass sie gespiegelt bleibt, oder ?

    ich mein, es is ja ein unterschied ob ich ein bild auf einem blatt papier
    einfach spiegelverkehrt jemanden vor die nase halte (StretchBlt) oder ob ich das blatt zwar richtig rum halte, aber das bild insich gespiegelt gezeichnet ist

    sonst hät es ja mit ScanRegion von para gehen müssen, habs schon getestet, aber es passiert gar nix

    [ Dieser Beitrag wurde am 13.03.2003 um 00:04 Uhr von Hammer editiert. ]



  • Dann mach dir ein neues Bitmap und ein neues DC, hau das Bitmap in das DC (SelectObject) und male das Original-Bitmap per StretchBlt() in das neue DC. Hol das neue Bitmap wieder aus dem neuen DC raus und zerstöre das neue DC. Nun hast du mit dem neuen Bitmap das gespiegelte Bitmap.

    Ich würde dir allerdings raten, das gespiegelte Bitmap als Resource mitzuführen.



  • als resource ?
    du meinst neu malen und dann 3 bitmaps neu einladen ?

    ich mein das wär auch ne variante im malprogramm die dinger grad zu spiegeln und als neue bmp abzuspeichern. aber dadurch wird halt das prog größer, bin jetz schon bei 300kb (5 bmps)

    [ Dieser Beitrag wurde am 13.03.2003 um 00:19 Uhr von Hammer editiert. ]



  • Original erstellt von Hammer:
    bin jetz schon bei 300kb

    WAAAAAAAAAAAAAAS??? Zu viel! Das liegt bestimmt u.a. daran, dass deine Bitmaps 32-Bit-Bitmaps sind. 16 Farben sollten es doch wohl auch tun, oder? Also jedenfalls höchstens 256.



  • so..
    hab jetz 8 bmps auf 16 farben... und bin von 400kb auf 224kb runter gekommen
    mehr scheint wohl nich drin zu sein

    is aber komisch, ohne bitmaps und dlg kommt er schon auf 180kb
    para hatte auch nur 40 kb mit einer bitmap

    [ Dieser Beitrag wurde am 13.03.2003 um 11:52 Uhr von Hammer editiert. ]



  • Original erstellt von Hammer:
    is aber komisch, ohne bitmaps und dlg kommt er schon auf 180kb
    para hatte auch nur 40 kb mit einer bitmap

    Das wird wohl am Compiler liegen.



  • MSVC++ 🙄

    naja aber praktisch is er..

    weisst du ob #pragma comment(lib, "...") oder #pragma message() auch von anderen compiern wie borland unterstützt wird ?



  • comment ja. message weiß ich nicht.


Anmelden zum Antworten