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
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

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
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
(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
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
Deins hat bei mit 84ms
also noch mal 10ms schneller als meins ...

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