Wie schreibe ich ein Perl-Skript digitale Bilder herauszufiltern, die frisiert wurden?

StackOverflow https://stackoverflow.com/questions/1623057

  •  06-07-2019
  •  | 
  •  

Frage

Letzte Nacht vor dem Schlafengehen, durchsuchte ich durch den Scalar Abschnitt Datum Learning Perl wieder und kam über den folgenden Satz:

  

die Fähigkeit, ein beliebiges Zeichen in einer Zeichenfolge zu haben bedeutet, dass Sie erstellen, scannen und rohe Binärdaten als Strings manipulieren.

Eine Idee hat mich sofort, dass ich tatsächlich lassen konnte Perl die Bilder scannen, die ich auf meiner Festplatte gespeichert sind, zu überprüfen, ob sie die Zeichenfolge Adobe enthalten. Es scheint so zu tun, kann ich sagen, wer von ihnen mit Photoshop wurde. Also habe ich versucht, die Idee umzusetzen und kam mit dem folgenden Code auf:

#!perl
use autodie;
use strict;
use warnings;

{
    local $/="\n\n";
    my $dir = 'f:/TestPix/';
    my @pix = glob "$dir/*";

    foreach my $file (@pix) {
        open  my $pic,'<',  "$file";

        while(<$pic>) {
            if (/Adobe/) {
                print "$file\n";
            }
        }
    }
}

Aufregend, scheint der Code wirklich zu arbeiten, und es macht den Job, die Bilder von Ausfiltern, die mit Photoshop wurden. Aber Problem ist, viele Bilder von anderen Dienstprogrammen bearbeitet werden. Ich glaube, ich bin ein bisschen dort stecken. Haben wir eine einfache, aber universelle Methode zu sagen, wenn ein digitales Bild bearbeitet wurde oder nicht, so etwas wie

if (!= /the origianl format/) {...}

Oder müssen wir einfach mehr Bedingungen hinzufügen? wie

if (/Adobe/|/ACDSee/|/some other picture editors/)

Irgendwelche Ideen dazu? Oder bin ich aufgrund meiner elendig begrenzten Programmierkenntnisse zu stark zu vereinfachen?

Danke, wie immer, für jede Führung.

War es hilfreich?

Lösung

Ihre beste Wette in Perl ist wahrscheinlich ExifTool . Dadurch erhalten Sie Zugriff auf alles, was nicht-Bildinformation in das Bild eingebettet. Jedoch, wie andere Leute schon gesagt, ist es möglich, diese Informationen strippen, natürlich.

Andere Tipps

Ich werde nicht sagen, es gibt absolut keine Möglichkeit, Veränderungen in einem Bild zu erkennen, aber das Problem ist extrem schwierig.

Die einzige Person, die ich kenne, der behauptet, eine Antwort zu haben, ist Dr. Neal Krawetz , der das digital geändert Teile eines Bildes beansprucht unterschiedlichen Kompressionsfehlerraten von den ursprünglichen Teilen haben. Er behauptet, dass ein JPEG in verschiedenen Qualitätsstufen erneutes Speichern wird diese Unterschiede hervorzuheben.

habe ich nicht gefunden dies der Fall zu sein, in meinen Untersuchungen, aber vielleicht könnten Sie bessere Ergebnisse haben.

Nein. Es gibt keine funktionelle Unterscheidung zwischen einem perfekt bearbeiteten Bild, und eine, die die Art und Weise war es von Anfang an - es ist alles nur eine Tasche von Pixeln in dem Ende, nachdem alle, und andere Metadaten können Sie entfernen oder schmieden alles, was Sie wollen.

Der Name des Programms, Grafiken verwendet, um das Bild zu bearbeiten ist nicht Teil der Bilddaten selbst, sondern von etwas Metadaten genannt -, die können in der Bilddatei aber gespeichert werden, wie andere haben darauf hingewiesen, ist weder erforderlich noch zuverlässig (so einige Programme es nicht speichern können, einige möglicherweise eine Möglichkeit, nicht speichern lassen) - wenn Sie ein Bild geschmiedet, haben Sie die Meta-Daten als auch geschmiedet

.

So ist die Antwort auf Ihre Frage lautet: „Nein, es gibt keinen Weg, um allgemein zu sagen, ob das Bild bearbeitet wurde oder nicht, auch wenn einige Bildbearbeitungssoftware seine Unterschrift in die Bilddatei schreiben kann und es wird dort bleiben durch Unachtsamkeit die Bearbeitung Person.

Wenn Sie geneigt sind mehr über die Bildverarbeitung in Perl zu lernen, könnten Sie einen Blick auf einige der hervorragenden Module nehmen CPAN zu bieten hat:

  • Bild :: Magick - lesen, bearbeiten und schreiben von einer großen Zahl Bilddateiformate
  • GD - Erstellen von Farbzeichnungen eine große Anzahl von Grafik-Primitiven verwendet und emittieren die Zeichnungen in verschiedenen Formaten.
  • GD :: Graph - Diagramme erstellen
  • GD :: Graph3d - Erstellung von 3D-Graphen mit GD und GD :: graph

Es gibt jedoch auch andere Dienstprogramme zur Verfügung zur Identifizierung verschiedene Bildformate. Es ist eher eine Frage für Super User , aber für verschiedene Unix-Distributionen Sie file zu identifizieren, viele verschiedene Arten von Dateien und für MacOSX verwenden können, Graphic Converter hat mich nie im Stich lassen. (Es war sogar in der Lage, den bizarren Multi-File-X-ray meiner Katze zertrümmerten Becken zu öffnen, die mich auf einer Disc vom Tierarzt erhielt.)

Wie werden Sie wissen, was das ursprüngliche Format ist? Ich bin mir ziemlich sicher, dass es keine garantierte Art und Weise zu sagen, ob ein Bild geändert wurde.

kann ich nur öffnen Sie die Datei (mit meinem Lieblings-Programmiersprache und Dateisystem-API) und nur schreiben, was ich in diese Datei will nolens volens. Solange ich mit dem Dateiformat nicht etwas vermasselt, dann würden Sie nie wissen, dass es passiert ist.

Heck, konnte ich das Bild ausdrucken und dann in Scan-Rückteil; wie würden Sie es von einem Original sagen?

Wie andere gesagt hat, gibt es keine Möglichkeit zu wissen, ob das Bild frisiert wurde. Ich vermute, was wollen Sie im Grunde wissen, ist der Unterschied zwischen einer realistischen Fotografie und einem, die verbessert oder verändert wurde.

Es gibt immer die Möglichkeit, einen extrem komplexen Bilderkennungsalgorithmus ausgeführt wird, der jedes Pixel in Ihrem Bild analysieren würde und einige sehr komplizierte Dinge tun, um zu bestimmen, ob das Bild frisiert wurde oder nicht. Diese Lösung würde wahrscheinlich AI beinhalten, welche Millionen von Fotos untersuchen würde, die beide frisiert sind und diejenigen, die von ihnen nicht und erfahren sind. Dies ist jedoch eher eine theoretische Lösung und ist nicht sehr praktisch ... würden Sie wahrscheinlich sehen es nur in Filmen. Es wäre äußerst komplex sein zu entwickeln und vermutlich Jahre dauern. Und selbst wenn Sie so etwas wie dies bekommen haben zu arbeiten, wäre es wahrscheinlich noch nicht 100% richtig die ganze Zeit. Ich vermute, noch AI-Technologie ist auf dieser Ebene nicht und könnte eine Weile dauern, bis es ist.

Eine nicht allgemein bekannte Funktion von exiftool können Sie die Ursprungssoftware durch eine Analyse der JPEG-Quantisierungstabellen (nicht unter Berufung auf das Bild Metadaten) erkennen. Er erkennt Tabellen, die von vielen Anwendungen geschrieben. Beachten Sie, dass einige Kameras die gleichen Quantisierungstabellen wie einige Anwendungen verwenden können, so dass dies nicht eine 100% ige Lösung ist, aber es lohnt sich, in. Hier ist ein Beispiel für exiftool läuft auf zwei Bilder, die zuerst von Photoshop bearbeitete wurde.

> exiftool -jpegdigest a.jpg b.jpg
======== a.jpg
JPEG Digest                     : Adobe Photoshop, Quality 10
======== b.jpg
JPEG Digest                     : Canon EOS 30D/40D/50D/300D, Normal
    2 image files read

Dies funktioniert sogar, wenn die Metadaten entfernt wurden.

Es gibt bestehende Software gibt, die verschiedenen Techniken (Kompression artifacting, Vergleich zur Signaturprofile in einer Datenbank von Kameras, etc.) verwendet, um die tatsächlichen Bilddaten zum Nachweis von Veränderungen zu analysieren. Wenn Sie Zugriff auf eine solche Software haben und die Software zur Verfügung stellt eine API für den externen Zugriff auf diese Analysefunktionen, dann gibt es eine gute Chance, dass ein Perl-Modul vorhanden ist, die mit dieser API-Schnittstelle wird und, wenn kein solches Modul vorhanden ist, könnte es wahrscheinlich ziemlich schnell erstellt werden.

In der Theorie wäre es auch möglich sein, den Bildanalyse-Code direkt in nativen Perl zu implementieren, aber ich bin mir nicht bewusst jemand getan zu haben, so, und ich erwarte, dass Sie besser dran, etwas, das Low-Level zu schreiben würden und prozessorintensiv in einer vollständig kompilierte Sprache (zB C / C ++) und nicht in Perl.

http://www.impulseadventure.com/photo/jpeg-snoop.html ist ein Werkzeug, das die Arbeit fast gut

tut

Wenn es irgendein Klonen wurde, gibt es eine Variation in der Pixel density..or Konzentration, die manchmal zeigt sich .. bei manueller Inspektion ein Photoshop geklonten Bereich sogar Pixeldichte haben (meine Bedeutung Variation der Pixel eines gescannten Bildes wrt)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top