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
PYTHON JPG Datei nach Bearbeitung nicht mehr lesbar
- noisefloor
- User
- Beiträge: 3843
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
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
Eine JPEG-Datei besteht ja aus weit mehr als nur Bilddaten (siehe z.B. Erklärung bei Wikipedia).addiert eine Variable mit jedem Byte und nimmt den Modulus aus 255
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
@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
@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.
- noisefloor
- User
- Beiträge: 3843
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@Dav1d:
Letztendlich ist aber dann in der Tat nicht eindeutig, welche Datei sich nicht öffnen lässt.
Gruß, noiserfloor
@Dav1d:
Ich hatte das "erstellte auf die mit der Addition bezogen - wird weiter oben im Post auch als "erstellte Datei" bezeichnet.jedoch kann ich die erstellte Datei nicht mit der Windows Fotoanzeige öffnen, die alte jedoch schon.
Letztendlich ist aber dann in der Tat nicht eindeutig, welche Datei sich nicht öffnen lässt.
Gruß, noiserfloor
Ja sorry, dass ich nicht eindeutig genug war und WOW, wie schnell ihr geantwortet habt
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:
----------------------------------------------------------------------
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
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
@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.
Um jetzt zu wissen, was Du beim Erzeugen der Datei falsch machst, solltest Du noch dieses Programm auch noch zeigen.
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 ?
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 ?
@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.
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.
@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
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
@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.
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.
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.
@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
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
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
@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:
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.
Code: Alles auswählen
In [1]: -1 & 0xff
Out[1]: 255
In [2]: -1 % 0xff
Out[2]: 254