2016-04-15 11 views
0

Ich verschiebe derzeit ein Skript, das lokale sensible Hashes von Bildern von einem Windows-Host zu einem debian-Host erstellt.
Mein Problem ist Kissen liefert unterschiedliche Bilddaten aus dem gleichen Quellbild auf beiden Plattformen.
Ich habe nur dieses Verhalten für JPEGs beobachtet.
Testfall:Verschiedene Bilddaten aus der gleichen Quelle mit Kissen

from PIL import Image 
import md5 
import urllib2 
from cStringIO import StringIO 
urls = ("https://i.imgur.com/Mx6NQwM.jpg","https://i.imgur.com/MN1TKu5.png") 
print("VERSION %s" % Image.VERSION) 
for url in urls: 
    response = urllib2.urlopen(url).read() 
    img = Image.open(StringIO(response)).convert("RGB") 
    img_md5 = "".join("".join(map(chr, x)) for x in img.getdata()) 
    print("URL: %s" % url) 
    print("Plain md5:\t%s" % md5.new(response.read()).hexdigest()) 
    print("Image md5:\t%s" % md5.new(img_md5).hexdigest()) 

Sollte das gleiche md5 Hashes auf beiden Systemen zurück. Meine Ergebnisse:
Windows 7:

VERSION 1.1.7 
URL: https://i.imgur.com/Mx6NQwM.jpg 
Plain md5: 4aacd5b92575ffca6d0ab884f95cc1f9 
Image md5: 10eaf568f4d9d33c722ea702fc4d1025 
URL: https://i.imgur.com/MN1TKu5.png 
Plain md5: d05e6dc1311339b806e5998f15fc818c 
Image md5: 38fc986c5cd9605038ee627b11687344 

Debian jessie:

VERSION 1.1.7 
URL: https://i.imgur.com/Mx6NQwM.jpg 
Plain md5:  4aacd5b92575ffca6d0ab884f95cc1f9 
Image md5:  7347c6286f4d917649d967a5025e392e 
URL: https://i.imgur.com/MN1TKu5.png 
Plain md5:  d05e6dc1311339b806e5998f15fc818c 
Image md5:  38fc986c5cd9605038ee627b11687344 

Die LSHS sind etwas ähnlich, aber unterschiedlich genug für sie problematisch.
Die Kissenversion auf beiden Systemen ist 2.9.0.

Gibt es eine Möglichkeit, den gleichen Pixelwert auf dem Debian-System zu bekommen, wie ich auf den Windows-One bekomme?
Und allgemein: Weiß jemand, warum das passiert?

+0

Nur um sicherzustellen, dass Pillow die jpeg-Datei auf beiden Systemen korrekt verarbeitet, haben Sie versucht, die Daten anzuzeigen oder sie in ein PNG umzuwandeln und dann die MD5 auf beiden Systemen zu berechnen? –

+0

@SteveBarnes Habe es einfach ausprobiert und die Bilder sehen korrekt aus und die Konvertierung nach PNG ergab die erwarteten Ergebnisse (unterschiedlich für das erste Bild, dasselbe für das zweite Bild) – SleepProgger

Antwort

0

Ich "löste" mein Problem.
Ich hatte PIL und Pillow versehentlich auf dem Windows-Host installiert.
Es sieht so aus, als ob es die PIL Version verwendet.
Nach der Verwendung von PIL auf der debian-Maschine, sind die Ergebnisse auf beiden Maschinen identisch.
Im Allgemeinen wäre es klüger, die PIL Seite zu aktualisieren, um Pillow zu verwenden, aber in meinem Fall muss ich genau die gleichen Hashes generieren, wie ich es mit der PIL-Version getan habe.

Moral der Geschichte: PIL und Pillow können unterschiedliche Bilddaten beim Laden der gleichen Bilder zurückgeben.

1

Ich persönlich würde nicht erwarten, dass die interne Bilddarstellung notwendigerweise identisch sein wird zwischen verschiedenen Maschinen &/oder Betriebssysteme - vor allem, wenn einer von ihnen 64 Bit und der andere 32 Bit ist. Das ist nicht garantiert und es ist, was Sie das Bild MD5 auf berechnen - Sie erhalten die gleiche Datei MD5 auf beiden Systemen, so dass die Datei identisch ist, wenn Sie die Bilddaten MD5 benötigen, dann sollten Sie zuerst eine Bitmap mit bekannten Eigenschaften konvertieren - dann MD5 die Bitmap und nicht das "Bild".