BPS #16: Schwarzweiß ist das neue Bunt - Auswertung
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
XeresModeratorBetreff: BPS #16: Schwarzweiß ist das neue Bunt - Auswertung |
So, Jan 22, 2012 15:33 Antworten mit Zitat |
|
---|---|---|
So! Wer konnte die Transformation umsetzen?
Das war die Aufgabe Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern. Diskussion Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen. Nächste Aufgabe In einer Woche wird die Musterlösung nach editiert und in 2 die nächste Aufgabe eingestellt. Viel Spaß & viel Erfolg! Musterlösung: BlitzMax: [AUSKLAPPEN] SuperStrict Wie DerHase so richtig im Chat bemerkte (und einige wussten oder nach schlugen) ist der Grauton hier nur ein Mittelwert. Um ein Bild in Grausstufen mit der richtigen Luminanz (d.h. die Helligkeit der Farben bleibt erhalten) zu konvertieren, muss man die Farben in einem Verhältnis von 30% Rot, 59% Grün, und 11% Blau mischen. Wieder was gelernt! |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
- Zuletzt bearbeitet von Xeres am Mo, Feb 06, 2012 0:53, insgesamt 2-mal bearbeitet
Lobby |
So, Jan 22, 2012 18:14 Antworten mit Zitat |
|
---|---|---|
Weil solche Bildoperationen oftmals möglichst schnell ablaufen sollen, beschreibe ich die Speicherplätze der Pixmap-Pixeldaten selbst. Mit Xeres seinem Bild (Auflösung von 256x256) komme ich somit bei folgendem Code auf eine Generierungszeit von durchschnittlich 2ms, ich denke das sollte schnell genug sein.
BlitzMax: [AUSKLAPPEN] SuperStrict Zur Erklärung des Codes, die Funktion makePixmapMonochrome:TPixmap(sourcePix:TPixmap) liefert eine eingegraute Pixmap der Pixmap sourcePix zurück. Diese hat das Format PF_RGBA8888, könnte also hier unnötigerweise auch verschiedene Farben enthalten, allerdings halte ich sie in diesem Format für universal einsetzbarer. Zum Berechnen der Graustufe verwende ich trivialerweise den Durchschnitt der drei Farbwerte (siehe col = (r + g + b) / 3). Um aus einem TImage eine Pixmap zu erhalten, verwende ich wie üblich dessen Methode Lock:TPixmap(index:Int, read:Int, write:Int). Um eine Pixmap wieder in ein Image zu verwandeln, gebe ich schlichtweg bei LoadImage:TImage(object:Object) die Pixmap als object an. Hier noch eine alternative makePixmapMonochrome:TPixmap(sourcePix:TPixmap)-Funktion, die zwar etwas langsamer als meine oben gezeigte Umsetzung zu sein scheint (bei mir ~3ms), dafür aber bedeutend weniger Schreibarbeit ist. BlitzMax: [AUSKLAPPEN] Function makePixmapMonochrome:TPixmap(sourcePix:TPixmap) |
||
Blitzcraft |
So, Jan 22, 2012 23:18 Antworten mit Zitat |
|
---|---|---|
Wenn auch noch ein bischen spät, hier ist mein Beitrag und erst im falschen Thread:
Einfach ein Bild auf das Programm 'dropen' um es in SW umzuwandeln oder das Programm normal starten um einen zufälligen Farbverlauf in SW umzuwandeln. Ich hab mich für die sprichwörtliche Durchschnittslösung entschieden Außerdem ist das alles auserordentlich schnell! Für Xeres' Bild braucht es grade mal 0.007 Sekunden Code: [AUSKLAPPEN] 'BPS # 16 Beitrag von Blitzcraft
SuperStrict AppTitle="Bunt zu Schwarzweiß" SeedRnd MilliSecs() 'Per Drag'n'Drop übergebenes Bild laden und kopieren und bei Fehler ein Farbverlauf als Bild nehmen Local IMG_BUNT:TPixmap If AppArgs.length>1 IMG_BUNT=LoadPixmap(AppArgs[1]) If IMG_BUNT=Null IMG_BUNT=Farbverlauf:TPixmap(Rnd(30,240),Rnd(30,240),Rnd(30,240)) End If Else IMG_BUNT=Farbverlauf:TPixmap(Rnd(30,240),Rnd(30,240),Rnd(30,240)) End If Local IMG_SW:TPixmap=CopyPixmap(IMG_BUNT) 'Graphik aktivieren und Fenstergröße ensprechend einstellen Graphics 15+PixmapWidth(IMG_BUNT)*2,35+PixmapHeight(IMG_BUNT),0,0 Local t:Float=SW_IMG:Float(IMG_SW) 'SW Bild erstellen Local timer:TTimer=CreateTimer(60) While Not AppTerminate() Cls 'Fenster vollmalen DrawText "Bunt:",6,2 DrawText "Schwarzweiss:",11+PixmapWidth(IMG_BUNT),2 DrawText "Das Bild wurde in "+Left$(t,Instr(t,".")+5)+" Sekunden umgewandelt!",6,17+PixmapHeight(IMG_BUNT) DrawPixmap(IMG_BUNT,5,15) DrawPixmap(IMG_SW,10+PixmapWidth(IMG_BUNT),15) Flip WaitTimer(timer) Wend End Function SW_IMG:Float(img:TPixmap) 'Bild SW machen Local msecs:Int=MilliSecs() 'Zeit merken Local pix:Int,rgb:Int,a:Int,r:Int,b:Int,g:Int For Local x:Int=0 Until PixmapWidth(img) 'jeden Pixel durchgehen For Local y:Int=0 Until PixmapHeight(img) 'Aktuellen Pixel auslesen und den Mittelwert der RGB-Werte für alle drei übernehmen pix=ReadPixel(img,x,y) WritePixel img,x,y,(pix & $FF000000)+((pix & $FF0000)/$10000+(pix & $FF00)/$100+(pix & $FF))/3*$10000+((pix & $FF0000)/$10000+(pix & $FF00)/$100+(pix & $FF))/3*$100+((pix & $FF0000)/$10000+(pix & $FF00)/$100+(pix & $FF))/3 Next Next Return (MilliSecs()-msecs)*0.001 'Dauer des Erstellens ausrechnen End Function Function Farbverlauf:TPixmap(fr:Int,fg:Int,fb:Int)'Farbverlauf erstellen und als Bild zurückgeben Local img:TPixmap=CreatePixmap(500,300,PF_RGB888),r:Float,g:Float,b:Float ClearPixels(img) For Local x:Int=0 Until 500 'jeden Pixel durchgehen 'entsprechende RGB-Werte ausrechnen r=Float(fr-(x+1)*(fr*0.002)) g=Float(fg-(x+1)*(fg*0.002)) b=Float(fb-(x+1)*(fb*0.002)) For Local y:Int=0 Until 300 '...und in das Bild malen WritePixel img,x,y,255*$1000000+Int(r)*$10000+Int(g)*$100+Int(b) Next Next Return img End Function |
||
Screenshot aus meinem ersten Projekt |
Propellator |
So, Jan 22, 2012 23:18 Antworten mit Zitat |
|
---|---|---|
BlitzMax: [AUSKLAPPEN] SuperStrict Realtime mit GLSL Shadern! Habe dafür Noo's Shader-Type gemopst, da ich zu faul war das ganze Laden und Linken der Shader selbst zu machen. Danke an DerHase fürs Berichtigen der Berechnungen! Das ganze ist so schnell, dass es alles bei jedem Zeichenvorgang umwandelt, und trotzdem flüssig läuft. True Story. |
||
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis. |
MasterSolaris |
Mo, Jan 23, 2012 17:26 Antworten mit Zitat |
|
---|---|---|
So, hier mal meine Funktion:
BlitzMax: [AUSKLAPPEN]
Das Bild wird Pixel für Pixel durchgegangen und dabei wird jeder einzelne Pixel in Graustufen konvertiert. Zum Schluss wird die Pixmap als PNG gespeichert. Ich hoffe, der Code ist halbwegs lesbar |
||
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group