Bilddaten in Liste Speichern

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.
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Gibt es eine möglichkeit, ein *.jpg einzulesen (file() und dann read()) und diese eingelesenen Daten dan irgendwie in eine Liste zu bekommen?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Ich verstehe überhaupt nicht was du tun willst. Kannst du mal ein wenig mehr rausrücken?
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

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 =(
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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()
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

das tool was du sucht heisst HJ-SPLIT für WIN un LINUX. Damit kannst du alles teilen und wieder zusammen setzen.
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

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?
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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
>>> 
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

@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.
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Ok. Und alle stücke werden in einer liste gespeichert. Das ist nice!
Danke für die super hilfe!
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Natürlich. Deswegen gibt es ja auch zwei Formen, die sich eben ganz unterschiedlich verhalten.
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

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..
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

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"?
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

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
BlackJack

Oder `os.path.getsize()`.
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Genau das hatte ich im Sinn ... aber scheinbar gerade nicht im Kopf :lol:
Antworten