Image schnell schwarzweiß machen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Image schnell schwarzweiß machen

Beitrag 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
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Image schnell schwarzweiß machen

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Image schnell schwarzweiß machen

Beitrag 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)
Zuletzt geändert von STARGÅTE am 06.05.2010 23:27, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Image schnell schwarzweiß machen

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

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Image schnell schwarzweiß machen

Beitrag 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
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Image schnell schwarzweiß machen

Beitrag von STARGÅTE »

Toll DrShrek :angry:

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

:lurk:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: Image schnell schwarzweiß machen

Beitrag 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
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Image schnell schwarzweiß machen

Beitrag von DrShrek »

@Kevin,

Ich bekomme bei deinen Beispiel einen DebuggerFehler. Da scheint was nicht ganz koscher zu sein.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: Image schnell schwarzweiß machen

Beitrag von Kevin »

und wo kommt der fehler?
bei mir klappt alles
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Image schnell schwarzweiß machen

Beitrag von DrShrek »

line 72
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Antworten