Seite 1 von 1

CopyImage Doppelt so schnell wie PB

Verfasst: 16.12.2006 15:35
von Franky
Hi Leute :?


Da ich probleme mit CopyImage hatte, hab ich mir eine eigene Funktion gebastelt. Ich dachte immer, PB arbeite genau so.

Code: Alles auswählen

Procedure CopyAlphaImage(mp_bild1,mp_bild2)
    If IsImage(mp_bild1)
        GetImageDataPointer(ImageID(mp_bild1),mp_haltvar.BITMAP)
        kpfm=CreateImage(mp_bild2,mp_haltvar\bmwidth,mp_haltvar\bmheight,mp_haltvar\bmbitspixel)
        If kpfm
            GetImageDataPointer(ImageID(mp_bild2),mp_haltvar2.BITMAP)
            CopyMemory(mp_haltvar\bmbits,mp_haltvar2\bmbits,mp_haltvar\bmwidth*mp_haltvar\bmheight*mp_haltvar\bmBitspixel/8)
        EndIf
    EndIf
    ProcedureReturn kpfm
EndProcedure    
Da ich den Performanceverlust und die Funktionstüchtigkeit rausfinden wollte, hab ich mir diese kleine Testumgebung gebastelt.

Code: Alles auswählen

Macro GetImageDataPointer(ImageID,Bild)
        GetObject_(ImageID,SizeOf(Bitmap),Bild)
EndMacro

Procedure CopyAlphaImage(mp_bild1,mp_bild2)
    If IsImage(mp_bild1)
        GetImageDataPointer(ImageID(mp_bild1),mp_haltvar.BITMAP)
        kpfm=CreateImage(mp_bild2,mp_haltvar\bmwidth,mp_haltvar\bmheight,mp_haltvar\bmbitspixel)
        If kpfm
            GetImageDataPointer(ImageID(mp_bild2),mp_haltvar2.BITMAP)
            CopyMemory(mp_haltvar\bmbits,mp_haltvar2\bmbits,mp_haltvar\bmwidth*mp_haltvar\bmheight*mp_haltvar\bmBitspixel/8)
        EndIf
    EndIf
    ProcedureReturn kpfm
EndProcedure    


Macro LoadAlphaCompatibleImage(pqrs_id,pqrs_name);Nur wichtig, wenn man jedes Bild in 32 Bit haben will
                anfid=LoadImage(#PB_Any,pqrs_name)
                If CreateImage(pqrs_id,ImageWidth(anfid),ImageHeight(anfid),32)
                    StartDrawing(ImageOutput(pqrs_id))
                            DrawImage(ImageID(anfid),0,0)
                    StopDrawing()
                    FreeImage(anfid)
                EndIf
EndMacro

LoadImage(5,"NormalBild.bmp")
k1=GetTickCount_()
For a=1 To 1000
   CopyImage(5,3)
   FreeImage(3)
Next
k2=GetTickCount_()
For a=1 To 1000
   CopyAlphaImage(5,3)
   FreeImage(3)
Next
k3=GetTickCount_()
MessageRequester("Ergebnisse:","PB: "+Str(k2-k1)+Chr(13)+"Ich: "+Str(k3-k2))

If OpenWindow(1,20,20,800,700,"Vergleich")
         CreateGadgetList(WindowID(1))   
              CopyImage(5,3)
              CopyAlphaImage(5,4)
              TextGadget(#PB_Any,0,0,400,20,"Originalbild")
              ImageGadget(#PB_Any,0,20,400,300,ImageID(5))
              TextGadget(#PB_Any,400,0,400,20,"Meine Kopie")
              ImageGadget(#PB_Any,400,20,400,300,ImageID(4))
              TextGadget(#PB_Any,0,340,400,20,"PBs Kopie")
              ImageGadget(#PB_Any,0,360,400,300,ImageID(3))
              Repeat
                  event=WaitWindowEvent()
              Until event=#WM_CLOSE 
EndIf              
End              

Tja und beim Test sind mir dann fast die Augen aus dem Kopf gefallen. Meins is doppelt so schnell wie das von PB. Ich hab ka, wovon das kommt, aber vielleicht hab ich ja was übersehen. Wenn ihr Fehler findet: BITTE MELDEN.

Achja, dank TS-Softs Tip hier noch n kleines Macro, dass die Native CopyImageFunktion von PB durch meine ersetzt:

Code: Alles auswählen

   Macro CopyImage(bild1,bild2)
          CopyAlphaImage(bild1,bild2)
   EndMacro

Mit besten Grüßen
Der Recht verwunderte Franky :shock:

Verfasst: 19.12.2006 10:29
von dige
Funktioniert nicht mit 256 Farb-Bildern ...

Verfasst: 19.12.2006 11:30
von dige
.. und wenn man statt Bitmaps mal ein Jpeg lädt, steht alles
auf dem Kopf ...

also schnell ist es ja, aber ... ;-)

Verfasst: 19.12.2006 16:25
von Franky
Hm, danke für den hinweis :|

Eine der Sachen, für die ich Windows hasse:
1.)Verquer gewählte und dann noch nichmal eingehaltene Standards
2.)Fehlende Dokumentation bzw. Befehle, wo welcher "Standard" verwendet wurde.
/:->

Naja, ich überleg mir was.

Es gibt zum beispiel keine möglichkeit, den BitmapInfoHeader aus zu lesen (ich such mal, wo der liegt), wo die Info drinsteht.