CopyImage Doppelt so schnell wie PB

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

CopyImage Doppelt so schnell wie PB

Beitrag 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:
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
dige
Beiträge: 1241
Registriert: 08.09.2004 08:53

Beitrag von dige »

Funktioniert nicht mit 256 Farb-Bildern ...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
dige
Beiträge: 1241
Registriert: 08.09.2004 08:53

Beitrag von dige »

.. und wenn man statt Bitmaps mal ein Jpeg lädt, steht alles
auf dem Kopf ...

also schnell ist es ja, aber ... ;-)
Zuletzt geändert von dige am 19.12.2006 16:39, insgesamt 1-mal geändert.
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag 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.
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Antworten