PYTHON JPG Datei nach Bearbeitung nicht mehr lesbar

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.
Antworten
R4yWex
User
Beiträge: 6
Registriert: Freitag 4. November 2016, 18:47

Ich habe testweise ein ziemlich simples Programm in Python 3 geschrieben.
Das Programm liest an sich nur deine jpg Datei binär ein und addiert eine Variable mit jedem Byte und nimmt den Modulus aus 255.
Anschließend wird die so entstandene Datei binär gespeichert. So weit so gut.
Der zweite Schritt ist das Einlesen der erstellten Datei und anschließend die Subtraktion der Variable sowie das erneute speichern der zurückgewandelten Datei.
Die entstandene Datei hat exakt dieselbe Größe wie die Ausgangsdatei und beim erneuten binären auslesen und vergleichen der beiden Dateien sind auch keine Differenzen vorhanden, jedoch kann ich die erstellte Datei nicht mit der Windows Fotoanzeige öffnen, die alte jedoch schon.
Kann mir da jemand helfen?

MfG R4yWex
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
addiert eine Variable mit jedem Byte und nimmt den Modulus aus 255
Eine JPEG-Datei besteht ja aus weit mehr als nur Bilddaten (siehe z.B. Erklärung bei Wikipedia).

Sprich, wenn du _jedes_ Byte manipulierst, machst du deine Datei in der Tat kaputt.

Sowas kannst du nur mit "reinen" Grafikdaten machen. Dazu gehören aber JPG, PNG. GIF & co nicht.

Gruß, noisefloor
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@noisefloor
R4yWex hat geschrieben:Der zweite Schritt ist das Einlesen der erstellten Datei und anschließend die Subtraktion der Variable sowie das erneute speichern der zurückgewandelten Datei.
the more they change the more they stay the same
BlackJack

@R4yWex: Wenn die Dateien, wie Du schreibst, den gleichen binären Inhalt haben, dann kann man die ”veränderte” Datei auch lesen und anzeigen lassen. Also irgendwas musst Du letztendlich doch am Inhalt geändert haben.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Dav1d:
jedoch kann ich die erstellte Datei nicht mit der Windows Fotoanzeige öffnen, die alte jedoch schon.
Ich hatte das "erstellte auf die mit der Addition bezogen - wird weiter oben im Post auch als "erstellte Datei" bezeichnet.

Letztendlich ist aber dann in der Tat nicht eindeutig, welche Datei sich nicht öffnen lässt.

Gruß, noiserfloor
R4yWex
User
Beiträge: 6
Registriert: Freitag 4. November 2016, 18:47

Ja sorry, dass ich nicht eindeutig genug war und WOW, wie schnell ihr geantwortet habt :D
Die Datei, welche sich im Nachhinein nicht öffnen lässt, ist diejenige, von welcher ich zum Schluss wieder 1 subtrahiere.
Und ja ihr habt Recht, ich hatte die Bytes nur stichprobenartig getestet.
Bei der Datei gibt es insgesamt 192 Fehler, ich hab schnell nochmal nen kleinens (und ja echt nicht schönes) Programm zum Testen geschrieben.
Das kam bei raus:

Code: Alles auswählen

with open(r"C:\Users\M\Desktop\sdsd\fs.PNG", 'br+') as save_data:
    a=(save_data.read())
with open(r"C:\Users\M\Desktop\sdsd\fs (2).PNG", 'br+') as save_data1:  #original Datei
    b=(save_data1.read())


c=str(a)
d=str(b)
print(c[679],d[679])
print(len(b))
g=0
u=0
while g<len(b):
    if c[g]!=d[g]:
        print(g,a[g],b[g],c[g],d[g],"----------------Fehler---------------------")

        u=u+1
    g=g+1
----------------------------------------------------------------------
und hier ein paar der Fehler

679 6 6 0 f ----------------Fehler---------------------
680 42 42 0 f ----------------Fehler---------------------
771 36 36 0 f ----------------Fehler---------------------
772 140 140 0 f ----------------Fehler---------------------
964 69 69 0 f ----------------Fehler---------------------
965 221 221 0 f ----------------Fehler---------------------
1073 36 36 0 f ----------------Fehler---------------------
1074 124 124 0 f ----------------Fehler---------------------

Ich hab erst vor einer woche mit python angefangen, also habt erbarmen mit mir :)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@R4yWex: Warum öffnest Du eine Datei, aus der Du nur lesen willst mit wahlfreiem Zugriff? Und ein Dateiobjekt aus dem man lesen will, save_data zu nennen, ist auch ungewöhnlich. Die restlichen Variablennamen sind auch nicht besser. Aus einbuchstabigen Namen kann man nicht herauslesen, wozu die gut sind. Hast Dir schon einmal angeschaut was `str(a)` liefert? Sicher nicht das, was Du erwartest. Das erklärt auch die komische Fehlerausgabe, wo zwar a und b gleich, c und d aber ungleich sind.

Um jetzt zu wissen, was Du beim Erzeugen der Datei falsch machst, solltest Du noch dieses Programm auch noch zeigen.
R4yWex
User
Beiträge: 6
Registriert: Freitag 4. November 2016, 18:47

In der Tat, die Zugriffsrechte waren unnötig, ich hab mir noch ein besseres Programm geschrieben, mit welchem ich wirklich die Bytes auslese und vergleiche.
Raus kam, dass jedes Mal die veränderte Datei im Nachhinein ein Byte mit dem Wert 0 besaß, während das Original an der gleichen Stelle den Wert 255 besaß.
Der Fehler war der Modulo.

Ein Beispiel:
Jewils die ausgelesenen Werte.
start_Datei temporäre_Datei end_Datei

255 + 1 = 256
256%255=1
1-1=0
0%255=0

0 + 1 = 1
1%255=1
1-1=0
0%255=0

Bei beidem ist das Ergebnis = 0, da kein Rest von 255 sowohl von 0 bei Modulo 255 vorhanden ist. Deswegen entstanden bei mir Fehler.



Das hab ich jetzt behoben, und ich habe keine Differenzen mehr beim Vergleich der Beiden Dateien, nur stellt sich die Frage, wie bekomme ich es hin, dass die End_Datei auch lesbar ist. Momentan ist es so, dass ich nach dem Ausführen des Programmes nicht mal mehr die Start_Datei lesen kann, obwohl ich diese nicht verändert habe.
Liegt wohl daran, dass ich zwei binär identische Dateien habe.
Hat jemand eine Idee, wie man das möglichst simpel umgehen kann ?
BlackJack

@R4yWex: Die Fragen im letzten Absatz verstehe ich nicht. Du kannst die Startdatei nicht mehr lesen? Die hast Du doch wie Du selbst sagst, überhaupt nicht verändert, also sollte die auch ganz normal von einem Bildbetrachter eingelesen und angezeigt werden können.

Kann es sein dass Du die Datei(en) nicht wieder schliesst und (unter Windows) deswegen andere Programme sie unter Umständen nicht lesen können?

Oder meinst Du das Du eine öffnest, liest und dann *nochmal* versuchst aus noch offenen Datei zu lesen? Das geht nicht weil der Lesezeiger am Ende der Datei steht wenn man sie komplett eingelesen hat und danach kommt halt nichts mehr. Auch wenn man das anders lösen könnte ist die einfachste Variante die Datei nach dem lesen zu schliessen, und folglich vor erneutem lesen wieder zu öffnen. Und nicht vergessen am Ende wieder zu schliessen. Die ``with``-Anweisung zusammen mit `open()` ist hier sehr hilfreich das schliessen in jedem Fall sicherzustellen.
R4yWex
User
Beiträge: 6
Registriert: Freitag 4. November 2016, 18:47

@BlackJack
Ich hab es eben nochmal ausprobiert und in der tat ich kann die Datei doch lesen, meine Windows Fotoanzeige hatte keine Rückmeldeung mehr :?
das eigentliche Problem ist jetzt, dass ich die end_Datei nicht verwenden kann, was ja anscheinen daran liegt, dass png jpg und co. nicht nur aus einer Datei bestehen.
Sie zu Archivieren und anschließend wieder zu Dearchivieren war leider auch erfolglos.
MFG R4yWex
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@R4yWex: bedenke, dass wir hier nur das wissen, was Du schreibst. Was meinst Du mit png besteht nicht nur aus einer Datei? Und was archivierst Du wie?
BlackJack

@R4yWex: Doch JPEG und PNG (& Co) bestehen nur aus einer Datei. Was ist denn bei Dir die ”Enddatei”? Die verschlüsselte? Die kann man dann in der Tat nicht als Bilddatei öffnen. Aber nach dem entschlüsseln sollte es dann wieder gehen. Ausser Du hast einen Fehler gemacht.
R4yWex
User
Beiträge: 6
Registriert: Freitag 4. November 2016, 18:47

Sorry, wenn ich mich zu unkonkret ausdrücke.
Also mal auf den Punkt gebracht, ich hab mir ein Verschlüsselungssysthem geschrieben, echt nichts Besonderes, jedoch will ich nicht nur txt Dateien verschlüsseln, sondern auch Bilder etc., dafür wird eine Datei mit einem Passwort Verschlüsselt.
Später will ich nur mit der verschlüsselten Datei und dem Passwort die ausgangs Datei wiederherstellen, jedoch ist die derzeitige Ausgangsdatei nicht lesbar, wenn ich zuvor eine Bilddatei verschlüsselt hatte.
BlackJack

@R4yWex: Das wird ja immer konfuser. Was hat denn die Ausgangsdatei einer *vorherigen* Verschlüsselung mit der aktuellen Verschlüsselung zu tun? Ich schliess mich mal Sirius3 an: Du machst Sachen von denen wir *nichts* wissen. Und erwartest jetzt das wir Dir sagen können was Du in Verschlüsselungscode falsch machst, den ausser Dir niemand kennt? :K
R4yWex
User
Beiträge: 6
Registriert: Freitag 4. November 2016, 18:47

Tut mir leid :( , dass ich hier für Verwirrung gesorgt hatte, hab mein Problem gefunden.
Ich konnte .txt Dateien ohne Probleme ver und entschlüsseln. Komplexere Dateien jedoch nicht.
Das lag daran, dass ich einen kleinen mathematischen Fehler hatte, welcher für txt Dateien irrelevant ist, jedoch nicht für Bilddateien.
Jetzt funktioniert alles.
Ich war einfach nur zu inkompetent.... Sorry :roll:
BlackJack

@R4yWex: Modulo würde ich hier auch nicht nehmen, denn dann muss man positive und negative Zahlen anders behandeln. Bei Zweierpotenzen, also zum Beispiel 2⁸ für Bytewerte, kann man stattdessen auch eine bitweise Und-Verknüpfung mit der entsprechenden Bitmaske verwenden:

Code: Alles auswählen

In [1]: -1 & 0xff
Out[1]: 255

In [2]: -1 % 0xff
Out[2]: 254
Statt mit irgendwelchen Dateien zu testen, solltest Du gezielt eine Datei zu testen erstellen die alle Bytewerte enthält und die ver- und entschlüsseln und mit der ursprünglichen Datei vergleichen. Das ist einfacher und man kann sich auch *sicher* sein, dass jeder mögliche Wert darin vorkommt.
Antworten