Einfaches Bitblt_ und ich raffs nicht.

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
garfield9992003
Beiträge: 35
Registriert: 24.04.2005 03:49

Einfaches Bitblt_ und ich raffs nicht.

Beitrag von garfield9992003 »

*grummel*

Warum ist das gespeicherte 0.jpg ok, aber das 1.jpg nicht ?
Es sollten doch beide identisch sein, oder?
Was ist am Bitblt_ denn falsch?

Bitte prügelt mich ruhig :)

Code: Alles auswählen

  hBMP.l=CreateImage(0, 200, 400)
  dcv.l=StartDrawing(ImageOutput()) 
  Box(50,50,100,300,RGB(255,255,255))
  StopDrawing()
  
  MemDC.l = CreateCompatibleDC_(dcv) 
  BitmapID.l = CreateImage(1,200,400) 
  SelectObject_(MemDC, BitmapID) 
  BitBlt_(MemDC, 0, 0, 200, 400, dcv , 0, 0, #SRCCOPY) 
  DeleteDC_(MemDC)
  
  UseJPEGImageEncoder()
  SaveImage(0, "0.jpg",#PB_ImagePlugin_JPEG)
  SaveImage(1, "1.jpg",#PB_ImagePlugin_JPEG)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Einfaches Bitblt_ und ich raffs nicht.

Beitrag von Danilo »

garfield9992003 hat geschrieben:*grummel*

Warum ist das gespeicherte 0.jpg ok, aber das 1.jpg nicht ?
Es sollten doch beide identisch sein, oder?
Was ist am Bitblt_ denn falsch?
Das BitBlt ist schon richtig.

1.) Der DC des Bild 0 (dcv) ist nur bis zum StopDrawing() gültig.
2.) CreateImage für Bild 1 muß außerhalb des Start/StopDrawing sein.

Punkt 1 ist ganz logisch, da dcv außerhalb Start/StopDrawing nicht
mehr gültig ist.

Punkt 2 kann ich nicht ganz nachvollziehen. Liegt intern daran
wie PB Images erstellt. Durch das CreateImage scheint dcv
ungültig zu werden, d.h. das CreateImage setzt scheinbar
intern etwas zurück, oder PB verwendet fälschlicherweise
intern einen globalen DC.

So gehts also:

Code: Alles auswählen

BitmapID = CreateImage(1,200,400) ; muss ausserhalb des StartDrawing sein
hBmp     = CreateImage(0,200,400)

dcv  = StartDrawing(ImageOutput())               ; dcv anfordern
If dcv
  Box(50,50,100,300,RGB(255,255,255))

  MemDC = CreateCompatibleDC_(dcv)               ; MemDC erstellen
  If MemDC
    oldBmp = SelectObject_(MemDC,BitmapID)       ; neues image setzen, altes speichern
     BitBlt_(MemDC,0,0,200,400,dcv,0,0,#SRCCOPY) ; blit
    SelectObject_(MemDC,oldBmp)                  ; altes image zuruecksetzen
    DeleteDC_(MemDC)                             ; MemDC freigeben
  EndIf

  StopDrawing()                                  ; dcv freigeben
EndIf

UseJPEGImageEncoder()
SaveImage(0,"0.jpg",#PB_ImagePlugin_JPEG)
SaveImage(1,"1.jpg",#PB_ImagePlugin_JPEG)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
garfield9992003
Beiträge: 35
Registriert: 24.04.2005 03:49

Beitrag von garfield9992003 »

Danke!

Das das Handle nur bis zum Stopdrawing gültig ist hatte ich inzwischen auch herausgefunden. Aber zu dem 2. Punkt bin ich auf nichts brauchbares gestossen. Ist wirklich ein wenig seltsam. Auf die Idee, das Createimage des 2. Bildes nach aussen zu packen, bin ich nicht gekommen. Der Paarzeiler hat mich echt Nerven gekostet :(

Nochmals Danke.

Grüße

Frank
Antworten