Seite 1 von 1
Bilder Pixel weiße auslesen, und wert in 16bit konvertieren
Verfasst: Donnerstag 6. Dezember 2012, 21:01
von Py-Prog
Hallo,
wie der Titel schon sagt möchte ich Bilddateien Pixel für Pixel den Farbwert auslesen, den wert in einen 16bit Farbwert umwandeln und dann an einen String anhängen. Als Beispiel sollte eine Datei 2x1 Pixel und in Weiß dann diesen String ergeben: "2x1|FFFFFFFF"
Ich hab jetzt schon python 2.7 und PIL installiert weil ich mit Google etwas gefunden habe dass das Pixel für Pixel auslesen in etwas so gehen soll
Aber das geht nicht.
Ich brauche so ein Skript weil ich für meinen Taschenrechner ein Pokemon Spiel machen will und die Bilder dafür muss ich eben so umwandeln. Deshalb möchte ich mich eigentlich nicht so lange mit der Entwicklung von dem Konverter aufhalten.
Re: Bilder Pixel weiße auslesen, und wert in 16bit konvertie
Verfasst: Donnerstag 6. Dezember 2012, 21:10
von /me
Py-Prog hat geschrieben:Ich hab jetzt schon python 2.7 und PIL installiert weil ich mit Google etwas gefunden habe dass das Pixel für Pixel auslesen in etwas so gehen soll
Aber das geht nicht.
Ich nehme mal an, dass du dir bereits Gedanken über die Umsetzung gemacht hast und entsprechend vorbereitet bist. Wenn nicht, dann brechen wir hier direkt ab und du kommst wieder wenn es so weit ist.
OK, du liest weiter, dann bist du ja gut gerüstet. Du hast der Pygame-Dokumentation ja entnommen, dass der Rückgabewert von
load() eine Instanz von Surface ist. Wo aber glaubst du der
Dokumentation von Surface entnehmen zu können, dass du auf diese Art Werte zuweisen kannst? Und noch schlimmer: Warum versuchst du etwas zuzuweisen wenn du es doch eigentlich auslesen willst?
Ich würde es mal mit
get_at probieren.
Re: Bilder Pixel weiße auslesen, und wert in 16bit konvertie
Verfasst: Donnerstag 6. Dezember 2012, 21:21
von Py-Prog
Ich will keine Wert einem Pixel zuweißen, sonder nur auslesen. Das Bild wie es der Lua-Interpreter braucht besteht nur aus einem String. (
link)
Ich hab jetzt auch herrausgefunden wie ich den Farbwert auslesen kann:
jetzt müsste ich nur noch wiesen wie ich das in so einen 16bit Farbwert Umwandeln kann, ohne Transparenz natürlich.
Re: Bilder Pixel weiße auslesen, und wert in 16bit konvertie
Verfasst: Freitag 7. Dezember 2012, 13:45
von Py-Prog
Ja, ich habs geschafft!!!
Code: Alles auswählen
import Image
hex_ =['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
im = Image.open(pfad)
im.load()
print im.size
pic = ''
for y in range(im.size[1]):
for x in range(im.size[0]):
for rggb in [0,1,1,2]:
pic += hex_[im.getpixel((x,y))[rggb] / 16]
print pic
Re: Bilder Pixel weiße auslesen, und wert in 16bit konvertie
Verfasst: Freitag 7. Dezember 2012, 13:54
von BlackJack
@Py-Prog: Naja wohl eher nicht. Die Bitverteilung stimmt nicht, du hast statt rgb-Pixeln mit 5-6-5 Bits die von der API erwartet werden rggb-Pixel mit 4-8-8-4 Bits wobei die beiden identischen Grünanteile tatsächlich nur die unteren vier Bits benutzen. Das ist Murks.
Re: Bilder Pixel weiße auslesen, und wert in 16bit konvertie
Verfasst: Freitag 7. Dezember 2012, 14:01
von Py-Prog
Ich kapier nicht wie das gehen soll, sin 5-6-5 Farbwert würde für mich heißen das von 1111111111111111 die ersten 5 bit 11111 rot sind, die nächsten 6 111111 grün und die letzen 5 11111 blau, aber wenn ich das so mache bekomme ich doch nicht den Hex wert FFFF.
Re: Bilder Pixel weiße auslesen, und wert in 16bit konvertie
Verfasst: Freitag 7. Dezember 2012, 14:15
von jerch
Welcher Wert kommt bei Dir raus?
Re: Bilder Pixel weiße auslesen, und wert in 16bit konvertie
Verfasst: Freitag 7. Dezember 2012, 15:15
von Py-Prog
Aber jetzt:

Die Farben sind jetzt sogar "kräftiger".
Code: Alles auswählen
import Image
im = Image.open(pfad)
im.load()
print im.size
pic = ''
for y in range(im.size[1]):
for x in range(im.size[0]):
r = bin(int((im.getpixel((x,y))[0] / 8)+0.5))[2:]
g = bin(int((im.getpixel((x,y))[1] / 4)+0.5))[2:]
b = bin(int((im.getpixel((x,y))[2] / 8)+0.5))[2:]
r = '0'*(5-len(r)) + r
g = '0'*(6-len(g)) + g
b = '0'*(5-len(b)) + b
hex_ = hex(int(r+g+b, 2))[2:].upper()
pic += '0'*(4-len(hex_)) + hex_
print pic
Danke für die Hilfe!
Re: Bilder Pixel weiße auslesen, und wert in 16bit konvertie
Verfasst: Freitag 7. Dezember 2012, 16:27
von Sirius3
Besser so:
Code: Alles auswählen
import Image
def rgb_to_16bit(rgb):
"Wandelt (r,g,b) in 5x6x5-Farbwert um"
return (((rgb[0]>>3)&0x1f)<<11)|(((rgb[1]>>2)&0x3f)<<5)|((rgb[2]>>3)&0x1f)
im = Image.open(pfad)
im.load()
print im.size
pic = ''.join('%04x'%rgb_to_16bit(rgb) for rgb in im.getdata())
print pic
Grüße
Sirius
Re: Bilder Pixel weiße auslesen, und wert in 16bit konvertie
Verfasst: Freitag 7. Dezember 2012, 17:29
von EyDu
@Sirius3: Was bezweckst du mit den ganzen Bitmasken? Wenn ein Integer von rgb aus dem Bereich 0-255 fällt, dann hat man so oder so ein Problem.
Hier das ganze noch einmal etwas generischer:
Code: Alles auswählen
def rgb_to_any(rgb, bits=(5, 6, 5)):
return reduce(lambda color, (v, b): (color<<b)|(v>>(8-b)), zip(rgb, bits))
Eine Erweiterung für beliebige Feldbreiten der übergebenen rgb-Werte ist sicher eine nette Übung.