Seite 2 von 3

Re: Image schnell schwarzweiß machen

Verfasst: 06.05.2010 22:58
von The_Dark_Zim-.-
Also ich hab die Sachen mal getestet, alles bis auf das von Rings und DrShrek.
Das von Rings ist schlecht weil ich da ein Screen öffnen müsste.
Das von DRShrek hm 1. dll 2. viel Arbeit es einzupflegen, aber wenn nichts weiter auftaucht muss ich es wohl Testen..

Leider ist meins das schnellste :D

Zeiten:
Meins: 1341
Volker: 1853
Stargate: 1523

Das Test-Bild als BMP
http://www.desktophdwallpaper.net/deskt ... 836%29.jpg

Mal sehen ob jemand was schnelleres hat :P, ich weiss garnicht mehr wo ich meins her hab XD

Re: Image schnell schwarzweiß machen

Verfasst: 06.05.2010 23:19
von ts-soft
Dein Code enthält erstens einen Bug, weil Du die Bildweite um 1 überschreitest und ist zweitens
lediglich bei einer unrelevanten Messung mit eingeschaltetem Debugger schneller, ansonsten ist
die Routine von StarGate mehr als 3 x so schnell (den Rest hab ich nicht getestet, da bin ich zu
faul, ausserdem sagt mit die logik schon, das Stargates Code der schnellste sein müßte.

Ergebnis GrayImage = 359 ms
Ergebnis ImageGray = 94 ms

Zu Früh gefreut :twisted:

Re: Image schnell schwarzweiß machen

Verfasst: 06.05.2010 23:24
von STARGÅTE
Das sieht doch mal wieder danach aus, als ob jemand Zeit-Tests mit Debugger macht :freak:

Debugger bei sowas immer ausmachen !

Hier mal mein Test-Code:

Code: Alles auswählen

Enumeration
  #Image1
  #Image2
  #Image3
  #Window
  #Gadget
EndEnumeration

Procedure ImageGrayCallback(x, y, TopColor, BottomColor)
  Gray = Red(TopColor)*0.56+Green(TopColor)*0.33+Blue(TopColor)*0.11
  ProcedureReturn Gray<<16+Gray<<8+Gray
EndProcedure

Procedure ImageGray(Image)
  StartDrawing(ImageOutput(Image))
    DrawingMode(#PB_2DDrawing_CustomFilter)
    CustomFilterCallback(@ImageGrayCallback())
    DrawImage(ImageID(Image), 0, 0)
  StopDrawing()
EndProcedure

Procedure GrayImage(Image) 
  If StartDrawing(ImageOutput(Image))
    For y1 = 0 To ImageHeight(Image)-1
      For x1 = 0 To ImageWidth(Image)-1
        Farbwert.l = Point(x1, y1)
        NeuerFarbwert = Round(Red(Farbwert) * 0.56 + Green(Farbwert) * 0.33 + Blue(Farbwert) * 0.11, 0)
        Plot(x1, y1, RGB(NeuerFarbwert, NeuerFarbwert, NeuerFarbwert))
      Next x1
    Next y1
    StopDrawing()
  EndIf
EndProcedure 

Procedure GrayScale(ImageNumber.l)
  ; Wandelt das übergebene Image (die ImageNummer von zB LoadImage()) in Graustufen
  Protected BufferSize.l
  Protected Buffer.l
  Protected x.l
  Protected Hell.l
  
  BufferSize.l = ImageWidth(ImageNumber.l) * ImageHeight(ImageNumber.l) * 4 - 1 ; Puffergrösse berechnen
  Buffer.l = AllocateMemory(BufferSize.l); speicher reservieren
  
  GetBitmapBits_(ImageID(ImageNumber.l), BufferSize.l, Buffer.l); Bilddaten in Speicher kopieren
  
  For x.l = 0 To BufferSize.l Step 3
    
    R.l = PeekB(Buffer.l + x.l + 2) & $FF
    G.l = PeekB(Buffer.l + x.l + 1) & $FF
    B.l = PeekB(Buffer.l + x.l) & $FF
    
    Hell.l = (0.3 * R.l + 0.59 * G.l + 0.11 * B.l) ; 0 bis 255
    
    PokeB(Buffer.l + x.l, Hell.l)
    PokeB(Buffer.l + x.l + 1, Hell.l)
    PokeB(Buffer.l + x.l + 2, Hell.l)
    
  Next
  
  SetBitmapBits_(ImageID(ImageNumber.l), BufferSize.l, Buffer.l)

  FreeMemory(Buffer.l)
  
EndProcedure 



UseJPEGImageDecoder()
UsePNGImageDecoder()


LoadImage(#Image1, "D:\1.jpg")
CopyImage(#Image1, #Image2)
CopyImage(#Image1, #Image3)

Time = ElapsedMilliseconds()
GrayImage(#Image1) 
Time1 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
ImageGray(#Image2)
Time2 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
GrayScale(#Image3)
Time3 = ElapsedMilliseconds()-Time

MessageRequester("Testergebnis", "The_Dark_Zim-.-: "+Str(Time1)+Chr(10)+"STARGÅTE: "+Str(Time2)+Chr(10)+"Volker Schmid: "+Str(Time3))
Ohne Debugger:
---------------------------
Testergebnis
---------------------------
The_Dark_Zim-.-: 391
STARGÅTE: 94
Volker Schmid: 125
---------------------------
OK
---------------------------
Im übrigen geht deiner garnicht ^^, erst wenn man ImageHeight(Image)-1 usw. macht, sonst gibs n IMA ^^

(So geschaft meiner ist der schnellste ^^)
ne aber wirklich, bitte nie mit Debugger Zeit-Tests machen,
weil ja bei vielen Sachen der Debugger mehr "kontrolliert" und deswgeen langsammer macht!

EDIT: Jo TS-Soft, wie denken wieder auf der selben Ebene zur selben Zeit ^^ Womit die UnschärfeRelation von Heisenberg widerlegt wurde :lol:
(ja ich weiß da gilt es für Impuls-Ort bzw. Zeit-Energie)

Re: Image schnell schwarzweiß machen

Verfasst: 06.05.2010 23:26
von ts-soft
STARGÅTE hat geschrieben: (So geschaft meiner ist der schnellste ^^)
Und ich hab das am schnellsten festgestellt :mrgreen:
Fast dasselbe Ergebnis:

Code: Alles auswählen

UseJPEGImageDecoder()
UsePNGImageDecoder()

Procedure GrayImage(Image)
  If StartDrawing(ImageOutput(Image))
    For y1 = 0 To ImageHeight(Image) -1
      For x1 = 0 To ImageWidth(Image) -1
        Farbwert.l = Point(x1, y1)
        NeuerFarbwert = Round(Red(Farbwert) * 0.56 + Green(Farbwert) * 0.33 + Blue(Farbwert) * 0.11, 0)
        Plot(x1, y1, RGB(NeuerFarbwert, NeuerFarbwert, NeuerFarbwert))
      Next x1
    Next y1
    StopDrawing()
  EndIf
EndProcedure

Procedure ImageBrightnessCallback(x, y, TopColor, BottomColor)
  Gray = Red(TopColor)*0.56+Green(TopColor)*0.33+Blue(TopColor)*0.11
  ProcedureReturn Gray<<16+Gray<<8+Gray
EndProcedure

Procedure ImageGray(Image)
  StartDrawing(ImageOutput(Image))
    DrawingMode(#PB_2DDrawing_CustomFilter)
    CustomFilterCallback(@ImageBrightnessCallback())
    DrawImage(ImageID(Image), 0, 0)
  StopDrawing()
EndProcedure




LoadImage(0, "desktop-hd-wallpaper (36).jpg")
CopyImage(0, 1)

time = ElapsedMilliseconds()
GrayImage(0)
time2 = ElapsedMilliseconds() - time
time = ElapsedMilliseconds()
ImageGray(1)
time3 = ElapsedMilliseconds() - time

MessageRequester("Test", "GrayImage = " + Str(time2) + #LF$ + "ImageGray = " + Str(time3))


Re: Image schnell schwarzweiß machen

Verfasst: 06.05.2010 23:31
von DrShrek
Und nun lassen wir doch mal die GBX Funktion 'GBX_GrayScale(...)' gegen den Rest antreten ;-)

Hier bereits die StaticLib in Verwendung...es geht nur GBX_GrayScale() ... Sorry ich muss das erst alles noch dokumentieren.

Hier die Exe:
Mit File wird ein Bild geladen , Mit Effekt wird der Effect ausgewählt und gestartet
http://em.q-soft.ch/files/get/E7QNkxhRz ... ithgbx.zip

Re: Image schnell schwarzweiß machen

Verfasst: 06.05.2010 23:35
von STARGÅTE
Toll DrShrek :angry:

Deins hat bei mit 84ms :allright:
also noch mal 10ms schneller als meins ...

:lurk:

Re: Image schnell schwarzweiß machen

Verfasst: 07.05.2010 00:00
von Kevin
meins ist nochmal ein bisschen schneller:

Code: Alles auswählen

Enumeration
  #Image1
  #Image2
  #Image3
  #Image4
  #Window
  #Gadget
EndEnumeration

Procedure ImageGrayCallback(x, y, TopColor, BottomColor)
  Gray = Red(TopColor)*0.56+Green(TopColor)*0.33+Blue(TopColor)*0.11
  ProcedureReturn Gray<<16+Gray<<8+Gray
EndProcedure

Global Dim ImageGrayArray.l(765)
For z=1 To 765
ImageGrayArray(z)=RGB(z/3,z/3,z/3)
Next
Procedure ImageGrayCallback2(x, y, TopColor, BottomColor)
  ProcedureReturn ImageGrayArray(Red(TopColor)+Green(TopColor)+Blue(TopColor))
EndProcedure

Procedure ImageGray(Image)
  StartDrawing(ImageOutput(Image))
    DrawingMode(#PB_2DDrawing_CustomFilter)
    CustomFilterCallback(@ImageGrayCallback())
    DrawImage(ImageID(Image), 0, 0)
  StopDrawing()
EndProcedure
Procedure ImageGray2(Image)
  StartDrawing(ImageOutput(Image))
    DrawingMode(#PB_2DDrawing_CustomFilter)
    CustomFilterCallback(@ImageGrayCallback2())
    DrawImage(ImageID(Image), 0, 0)
  StopDrawing()
EndProcedure
Procedure GrayImage(Image) 
  If StartDrawing(ImageOutput(Image))
    For y1 = 0 To ImageHeight(Image)-1
      For x1 = 0 To ImageWidth(Image)-1
        Farbwert.l = Point(x1, y1)
        NeuerFarbwert = Round(Red(Farbwert) * 0.56 + Green(Farbwert) * 0.33 + Blue(Farbwert) * 0.11, 0)
        Plot(x1, y1, RGB(NeuerFarbwert, NeuerFarbwert, NeuerFarbwert))
      Next x1
    Next y1
    StopDrawing()
  EndIf
EndProcedure 

Procedure GrayScale(ImageNumber.l)
  ; Wandelt das übergebene Image (die ImageNummer von zB LoadImage()) in Graustufen
  Protected BufferSize.l
  Protected Buffer.l
  Protected x.l
  Protected Hell.l
  
  BufferSize.l = ImageWidth(ImageNumber.l) * ImageHeight(ImageNumber.l) * 4 - 1 ; Puffergrösse berechnen
  Buffer.l = AllocateMemory(BufferSize.l); speicher reservieren
  
  GetBitmapBits_(ImageID(ImageNumber.l), BufferSize.l, Buffer.l); Bilddaten in Speicher kopieren
  
  For x.l = 0 To BufferSize.l Step 3
    
    R.l = PeekB(Buffer.l + x.l + 2) & $FF
    G.l = PeekB(Buffer.l + x.l + 1) & $FF
    B.l = PeekB(Buffer.l + x.l) & $FF
    
    Hell.l = (0.3 * R.l + 0.59 * G.l + 0.11 * B.l) ; 0 bis 255
    
    PokeB(Buffer.l + x.l, Hell.l)
    PokeB(Buffer.l + x.l + 1, Hell.l)
    PokeB(Buffer.l + x.l + 2, Hell.l)
    
  Next
  
  SetBitmapBits_(ImageID(ImageNumber.l), BufferSize.l, Buffer.l)

  FreeMemory(Buffer.l)
  
EndProcedure 



UseJPEGImageDecoder()
UsePNGImageDecoder()


LoadImage(#Image1, "desktop-hd-wallpaper (36).jpg")
CopyImage(#Image1, #Image2)
CopyImage(#Image1, #Image3)
CopyImage(#Image1, #Image4)

Time = ElapsedMilliseconds()
GrayImage(#Image1) 
Time1 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
ImageGray(#Image2)
Time2 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
GrayScale(#Image3)
Time3 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
ImageGray2(#Image4)
Time4 = ElapsedMilliseconds()-Time

SetClipboardText("The_Dark_Zim-.-: "+Str(Time1)+Chr(10)+"STARGÅTE: "+Str(Time2)+Chr(10)+"Volker Schmid: "+Str(Time3)+Chr(10)+"Kevin: "+Str(Time4))

MessageRequester("Testergebnis", "The_Dark_Zim-.-: "+Str(Time1)+Chr(10)+"STARGÅTE:"+Str(Time2)+Chr(10)+"Volker Schmid: "+Str(Time3)+Chr(10)+"Kevin: "+Str(Time4))
The_Dark_Zim-.-: 453
STARGÅTE: 94
Volker Schmid: 172
Kevin: 46

Re: Image schnell schwarzweiß machen

Verfasst: 07.05.2010 00:12
von DrShrek
@Kevin,

Ich bekomme bei deinen Beispiel einen DebuggerFehler. Da scheint was nicht ganz koscher zu sein.

Re: Image schnell schwarzweiß machen

Verfasst: 07.05.2010 00:22
von Kevin
und wo kommt der fehler?
bei mir klappt alles

Re: Image schnell schwarzweiß machen

Verfasst: 07.05.2010 00:27
von DrShrek
line 72