Probleme mit .asRGB Funktion (Python png-Modul)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Hallo Leute,

ich habe seit kurzem Interesse daran gefunden PNG-Dateien mithilfe von Python zu bearbeiten.
Beim Beschreiben von PNG-Dateien habe ich keine Probleme.
Wenn ich jedoch versuche sie zu lesen und in RGB-codes umzuwandeln, gibt er mir folgende Fehlermeldung aus:

Traceback (most recent call last):
File "/home/julien/Schreibtisch/Programmieren/Python/Bilder/Colorchanger/changer.py", line 76, in <module>
reader.asRGB()
File "/usr/local/lib/python2.7/dist-packages/png.py", line 2197, in asRGB
width,height,pixels,meta = self.asDirect()
File "/usr/local/lib/python2.7/dist-packages/png.py", line 2056, in asDirect
if not self.colormap and not self.trns and not self.sbit:
AttributeError: Reader instance has no attribute 'colormap'


Dies ist der Code dazu:

Code: Alles auswählen


import png

reader = png.Reader(filename = "png.png")

print(reader.asRGB())
kann mir vielleicht jemand weiter helfen?
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@Python1906: Dein png scheint keine gültige Datei zu sein.
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Was für PNG-Dateien sind denn gültig und woran erkenne ich es bzw. wie kann ich meine PNG-Datei gültig machen?
BlackJack

¹Python1906: Die Datei hat anscheinend keinen IHDR-Chunk, was der erste Chunk in einer PNG-Datei sein sollte. Da kann man dann wohl auch nicht mehr wirklich irgend etwas retten, denn da stehen wichtige Daten drin. Die Datei ist entweder unvollständig oder die Daten sind korrupt, also mindestens mal die Kennung von dem IHDR-Chunk. Wie gross ist die Datei denn (in Bytes)? Kann es sein das die nicht, oder nicht vollständig geschrieben wurde? Wie ist sie denn entstanden?
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Also ich habe sie aus Google Bilder heruntergeladen und dann einmal mit GIMP die Farben gewechselt.
Dann habe ich den Stern in der Mitte schwarz eingefärbt.

https://de.wikipedia.org/wiki/Datei:Cut ... s-icon.png

-> Dies ist der Link zum Originalbild

Mein Bild, welches ich dafür benutzt habe, ist dasselbe, nur rot mit weißem Stern
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@Python1906: das Original läßt sich laden. Hast Du bei GIMP das richtige Dateiformat gewählt?
BlackJack

@Python1906: Wie gross ist denn die geänderte Datei (in Bytes)? Und was ist das Ergebnis von ``file name-der-datei.png`` in einer Shell? Hier mal als Beispiel wie das bei einem PNG aussehen müsste:
[codebox=text file=Unbenannt.txt]bj@god:~$ file test.png
test.png: PNG image data, 75 x 277, 8-bit/color RGB, non-interlaced
bj@god:~$ head --bytes 128 test.png | hd
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|
00000010 00 00 00 4b 00 00 01 15 08 02 00 00 00 27 df 8f |...K.........'..|
00000020 8e 00 00 00 06 62 4b 47 44 00 13 00 15 00 16 30 |.....bKGD......0|
00000030 3a 82 e7 00 00 00 09 70 48 59 73 00 00 00 48 00 |:......pHYs...H.|
00000040 00 00 48 00 46 c9 6b 3e 00 00 4a 70 49 44 41 54 |..H.F.k>..JpIDAT|
00000050 78 da dd 7d 75 58 5b 57 dc ff b9 12 0f 49 48 48 |x..}uX[W.....IHH|
00000060 82 bb 53 2a d0 96 ba bb eb 56 d7 75 95 75 f5 b5 |..S*.....V.u.u..|
00000070 5b d7 d5 dd 65 75 59 75 f5 ae b6 ba 1b d4 28 14 |[...euYu......(.|
00000080[/code]
Beim Hexdump sieht man deutlich am Anfang das PNG und gleich als ersten Chunk den IHDR → Image HeaDeR, wo die Informationen über Pixelgrösse und Bittiefe drin stehen. Ohne diese Informationen wird es schwer den Rest der Datei richtig zu interpretieren.
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Als ich diese Befehle in der Shell eingegeben habe kam dies heraus:
[codebox=bash file=problem.bsh]
julien@JulienRechner:~$ cd /home/julien/Schreibtisch/Programmieren/Python/Bilder/Colorchanger/
julien@JulienRechner:~/Schreibtisch/Programmieren/Python/Bilder/Colorchanger$ file png.png
png.png: PNG image data, 225 x 225, 8-bit/color RGB, non-interlaced
julien@JulienRechner:~/Schreibtisch/Programmieren/Python/Bilder/Colorchanger$ head --bytes 128 png.png | hd
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|
00000010 00 00 00 e1 00 00 00 e1 08 02 00 00 00 b1 d1 45 |...............E|
00000020 2d 00 00 00 09 70 48 59 73 00 00 0b 13 00 00 0b |-....pHYs.......|
00000030 13 01 00 9a 9c 18 00 00 00 07 74 49 4d 45 07 e1 |..........tIME..|
00000040 05 19 12 1c 21 41 81 cf ff 00 00 20 00 49 44 41 |....!A..... .IDA|
00000050 54 78 da ec bd 7b 74 5c 57 7d 2f fe dd 7b 9f 33 |Tx...{t\W}/..{.3|
00000060 a3 99 91 e4 b1 64 59 96 df 76 30 c1 49 ea 26 84 |.....dY..v0.I.&.|
00000070 14 4a 52 5f 02 18 a7 34 37 85 1b 52 28 a5 e5 52 |.JR_...47..R(..R|
00000080
julien@JulienRechner:~/Schreibtisch/Programmieren/Python/Bilder/Colorchanger$ ^C
julien@JulienRechner:~/Schreibtisch/Programmieren/Python/Bilder/Colorchanger$
[/code]
BlackJack

@Python1906: Hm, das sieht auf den ersten Blick okay aus. Kannst Du die Datei zur Verfügung stellen?
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Also, wenn man in diesem Forum keine Dateien hochladen kann, wüsste ich keine andere Möglichkeit als E-Mail
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gibt auch so etwas: https://filebin.ca/
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

@__deets__: :D Jo, vielen Dank.

Die Datei kann man sich nun hierüber holen:
https://filebin.ca/3PjubqxDmKLq/png.png
BlackJack

Funktioniert bei mir:

Code: Alles auswählen

In [9]: reader = png.Reader('png.png')

In [10]: reader.asRGB()
Out[10]: 
(225,
 225,
 <itertools.imap at 0xa889e2c>,
 {'alpha': False,
  'bitdepth': 8,
  'greyscale': False,
  'interlace': 0,
  'last_mod_time': (2017, 5, 25, 18, 28, 33),
  'planes': 3,
  'resolution': ((2835, 2835), 1),
  'size': (225, 225),
  'text': {}})
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Von wo haben Sie eigentlich das png-Modul heruntergeladen. Vlt liegt es ja an eine fehlerhafte Installation
BlackJack

@Python1906: Ich habe mir purepng per ``pip`` aus dem Python Package Index installiert.
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Hm vielleicht liegt es ja daran. Denn ich habe mir pypng aus pip installiert
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Ach jetzt habe ich den Fehler selbst gefunden, denn vor der .asRGB()-Funktion habe ich die Chunk-Funktion verwendet. Nun habe ich sie entfernt und es funktioniert.

:) Danke an ALLE, die mir hierbei unterstützt haben.


Jedoch habe ich gemerkt, dass ich mit dem eigentlichen Sinn und Zweck nicht weiterkomme.
Weil ich dachte, dass die asRGB-Funktion mir die Pixel in RGB-Code umsetzt.
Also zum Beispiel ganz rotes Pixel als 255, 0, 0 ausgibt.

Weiß jemand von euch welche Funktion ich dafür verwenden kann
BlackJack

@Python1906: Das tut sie doch auch. Du bekommst einen Iterator über `bytearray`-Objekte für jede Zeile wo die Bytewerte für die Pixel drin sind.
Python1906
User
Beiträge: 29
Registriert: Mittwoch 9. November 2016, 13:52

Hm, jedoch bekomme ich dann folgendes:

[codebox=pycon file=Unbenannt.txt]
Python 2.7.13 (default, Jan 19 2017, 14:48:08)
[GCC 6.3.0 20170118] on linux2
Type "copyright", "credits" or "license()" for more information.
>>>
RESTART: /home/julien/Schreibtisch/Programmieren/Python/Bilder/Colorchanger/changer.py
(225, 225, <itertools.imap object at 0x7f588b51c990>, {'bitdepth': 8, 'text': {}, 'last_mod_time': (2017, 5, 25, 18, 28, 33), 'interlace': 0, 'planes': 3, 'greyscale': False, 'alpha': False, 'resolution': ((2835, 2835), 1), 'size': (225, 225)})
>>>
[/code]

Muss ich einen bestimmten weiteren Befehl anwenden?
BlackJack

@Python1906: Du bekommst ein Tupel mit Breite, Höhe, einem Iterator über die Zeilen und einem Wörterbuch mit Metainformationen. Über den Iterator musst Du iterieren um an die Pixel zu kommen. Pro Pixelzeile im Bild liefert der ein `bytearray`-Objekt mit drei Bytes pro Pixel.

Code: Alles auswählen

In [8]: reader = png.Reader('png.png')

In [9]: width, height, rows, info = reader.asRGB()

In [10]: rows
Out[10]: <itertools.imap at 0xa7216ac>

In [11]: row = next(rows)

In [12]: len(row)
Out[12]: 675

In [13]: width
Out[13]: 225

In [14]: len(row) / 3
Out[14]: 225

In [15]: row[:12]
Out[15]: bytearray(b'\xfe\xfb\xfb\xfe\xfb\xfb\xfe\xfb\xfb\xfe\xfb\xfb')

In [16]: row[0], row[1], row[2]
Out[16]: (254, 251, 251)
Was willst Du mit den Daten eigentlich machen und was ist der Grund für pypng im Gegensatz zu beispielseise der Python Imaging Library (PIL) oder Pillow und Numpy?
Antworten