Seite 1 von 2

Bilddaten in Liste Speichern

Verfasst: Donnerstag 17. August 2006, 14:55
von gorba
Gibt es eine möglichkeit, ein *.jpg einzulesen (file() und dann read()) und diese eingelesenen Daten dan irgendwie in eine Liste zu bekommen?

Verfasst: Donnerstag 17. August 2006, 15:05
von birkenfeld
In welcher Form willst du die Daten haben? Die reinen Binärdaten hast du ja mit file().read() bereits eingelesen. Wenn du das Bild als Bild einlesen willst, gibt es PIL.

Verfasst: Donnerstag 17. August 2006, 15:41
von gorba
Mit PIL wärs schon am schönsten, da ich das Bild anschlissend wider zusammensetzen muss. Allerdings scheint mein PIL keine Funktion compress zu haben... Keine ahnung wie das sein kann, sollte doch in PIL vorhanden sein.

Ich muss das Bild einfach in 700 Byte stücke zerschneiden um es dann zu übertragen, das ist das problem

Verfasst: Donnerstag 17. August 2006, 15:46
von birkenfeld
Ich verstehe überhaupt nicht was du tun willst. Kannst du mal ein wenig mehr rausrücken?

Verfasst: Donnerstag 17. August 2006, 15:53
von gorba
ok sry.

Ich wil ein belibiges *.jpg file in stücken von 700 Byte über eine Schnittstelle versenden und beim empfänger wider zu einem vollständigen *.jpg zusammensetzen und anzeigen.

Nur hab ich keine ahnung wie ich das ding zerscheiden soll und noch weniger ahnung wie ich es wider zusammenkriege =(

Verfasst: Donnerstag 17. August 2006, 16:13
von birkenfeld
Da reicht es doch völlig die Datei in 700-Byte-Stücke aufzuteilen, ohne sich darum zu scheren ob es eine JPEG-, eine HTML- oder eine andere Datei ist. Solange sie in der richtigen Reihenfolge zusammengesetzt wird.

Erhalten kannst du die Stückchen z.B. mit

Code: Alles auswählen

f = file("datei")
stuecke = list(iter(lambda: f.read(700), ""))
f.close()

Verfasst: Donnerstag 17. August 2006, 16:33
von pyStyler
das tool was du sucht heisst HJ-SPLIT für WIN un LINUX. Damit kannst du alles teilen und wieder zusammen setzen.

Verfasst: Freitag 18. August 2006, 07:50
von gorba
Ok birkenfeld ich hab versucht den code zu verstehen:
das lambda: f.read(700) wird dank des lambdas wie in einer funktion ausgeführt und der return wert von f.read() wird für den iter() als erstes argument verwendet. Was allerdings iter() bewirkt, konnte ich nicht herausfinden. Mein englisch ist für eine solche Beschreibung noch zu schlecht (evt. auch meine Kentnisse in Python).
Was bezweckt denn iter?
Und wie kann ich jetzt eigentlich überprüfen wie gross das erhaltene stück ist? Gibt es da was in Python wie sizeof() in c?

Verfasst: Freitag 18. August 2006, 11:21
von pyStyler
gorba hat geschrieben:Was bezweckt denn iter?

Code: Alles auswählen

>>> n=range(5)
>>> x=iter(a)
>>> x.next()
0
>>> x.next()
1
>>> x.next()
2
>>> x.next()
3
>>> x.next()
4
>>> x.next()
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    x.next()
StopIteration
>>> 

Verfasst: Freitag 18. August 2006, 12:58
von birkenfeld
@pyStyler: Das ist das iter() mit einem Argument und verhält sich ganz unterschiedlich zu iter() mit zwei Argumenten.

@gorba: Das iter() mit zwei Argumenten iter(func, ende) ruft func() für jeden Schleifendurchlauf auf, solange bis func() einmal den Wert ende zurückgibt. Dann wird die Schleife beendet.

Das lambda wird also nicht nur einmal ausgeführt, sondern bei jedem Schleifendurchlauf. Ist die Datei aufgebraucht, gibt read(), also auch das lambda "" zurück, und die Schleife wird beendet.

Verfasst: Freitag 18. August 2006, 14:40
von gorba
Ok. Und alle stücke werden in einer liste gespeichert. Das ist nice!
Danke für die super hilfe!

Verfasst: Freitag 18. August 2006, 16:35
von pyStyler
birkenfeld hat geschrieben:@pyStyler: Das ist das iter() mit einem Argument und verhält sich ganz unterschiedlich zu iter() mit zwei Argumenten.
ja das stimmt! Das zweite Argument ist allerdings nur Optional.

Verfasst: Freitag 18. August 2006, 17:16
von birkenfeld
Natürlich. Deswegen gibt es ja auch zwei Formen, die sich eben ganz unterschiedlich verhalten.

Verfasst: Montag 21. August 2006, 12:51
von gorba
Ich kriege nun die Teile nicht mehr zusammen, dacht ich mache so in der art was:

Code: Alles auswählen

f=open('test123.jpg', 'w')
f.write(picData)
Wobei dann in picData z.b. der 1ste teil des Bildes stehen würde. Allerdings schaut mien jpg nacher ein wenig komisch aus... Von was kommt das? Ich verändere ja die daten nicht..

Verfasst: Montag 21. August 2006, 13:09
von Nirven
So funktioniert es bei mir (nur mit dem rb bzw. wb, sonst kann ich das Ergebnis gar nicht öffnen):

Code: Alles auswählen

f = open("TestBild.jpg", 'rb')
stuecke = list(iter(lambda: f.read(700), ""))
f.close()

x = file("2ndTest.jpg", 'wb')
for i in stuecke:
    x.write(i)
x.close()
Was genau meinst du mit "es sieht komisch aus"?

Verfasst: Montag 21. August 2006, 13:33
von gorba
jop, habs nun auch mit dem wb Mode gemacht.
Gibt es was in python wie sizeof() in c, dass einem die grösse eines Objektes anzeigt?

Verfasst: Montag 21. August 2006, 13:40
von jens
len() ?

In einem Dateiobjekt geht das auch mit:

Code: Alles auswählen

f = file(...) # FileObjekt erzeugen

f.seek(0,2) # Am Ende der Daten springen
f_len = f.tell() # Aktuelle Position
f.seek(0) # Zurück zum Anfang springen

print "Datei größe in Bytes:", f_len

Verfasst: Montag 21. August 2006, 14:57
von midan23
jens hat geschrieben:

Code: Alles auswählen

f = file(...) # FileObjekt erzeugen

f.seek(0,2) # Am Ende der Daten springen
f_len = f.tell() # Aktuelle Position
f.seek(0) # Zurück zum Anfang springen

print "Datei größe in Bytes:", f_len
Es geht auch etwas einfacher:

Code: Alles auswählen

import os
f_len = os.stat(...).st_size

print "Dateigrösse : %s Bytes" % f_len

Verfasst: Montag 21. August 2006, 16:53
von BlackJack
Oder `os.path.getsize()`.

Verfasst: Montag 21. August 2006, 20:14
von midan23
Genau das hatte ich im Sinn ... aber scheinbar gerade nicht im Kopf :lol: