2013-08-28 68 views
9

Image.open ve Image.verify() bir bytearray'i ilk önce diske yazmadan ve im = Image.open() ile açmadan doğrulamaya çalışıyorum. .readfrombuffer() ve .readfromstring() yöntemine baktım, ancak resmin boyutuna ihtiyacım var (yalnızca resim akışını bir görüntüye dönüştürürken elde edebileceğim). Ben bir görüntüye ByteArray dönüştürmek için deneyin bir temel test olarakPIL: Bytearray Görüntüsünü Görüntüsüne Dönüştürme

def readimage(path): 
bytes = bytearray() 
count = os.stat(path).st_size/2 
with open(path, "rb") as f: 
    print "file opened" 
    bytes = array('h') 
    bytes.fromfile(f, count) 
return bytes 

Sonra:

bytes = readimage(path+extension) 
im = Image.open(StringIO(bytes)) 
im.save(savepath) 

birisi biliyorsa ne yapıyorum yanlış ya

Benim Salt Fonksiyon şöyle Bu baytları gerçekten bana yardımcı olacak bir görüntüye dönüştürmek için daha zarif bir yol varsa.

P.S .: Bytearray'a ihtiyacım olduğunu düşündüm çünkü baytlar üzerinde manipülasyon yapıyorum (görüntüleri kırın). Bu işe yaramadı, ancak diske yazmadan bunu yapmak istedim ve sonra kırık olup olmadığını kontrol etmek için tekrar diskten görüntü dosyasını açmayı istedim.

Düzenleme: Bütün bunlar o zaman io.BytesIO kullanmak zorunda, bytearrays ile manipüle ederse bana IOError: cannot identify image file

+0

Görüntüyü neden numpy dizisine okumayorsunuz? –

+1

@ViktorKerkez Görüntülerin Baytlarını değiştirmek istediğim için. Manipulation parçası için çalışma kodum var, ancak şimdi çıktı görüntüsünün aslında tamamen bozuk olmadığını doğrulamak istiyorum. Ben _have_ bytearrays ile çalışmak için – ato

cevap

10

olduğunu verir. Ayrıca bir dosyayı doğrudan bir bytearray'a da okuyabilirsiniz.

import os 
import io 
import Image 
from array import array 

def readimage(path): 
    count = os.stat(path).st_size/2 
    with open(path, "rb") as f: 
     return bytearray(f.read()) 

bytes = readimage(path+extension) 
image = Image.open(io.BytesIO(bytes)) 
image.save(savepath) 
+0

Neden st_size yarı? Ve neden “sayılsın” diye soruyorsunuz? – jdborg

+1

@jdborg Çünkü OP kendi sorusuyla aynı şeyi yaptı. :) Sadece kodu kopyalayıp yapıştırdım ve hatayı düzeltdim. –

+0

Ayrıca, "bayt" ın Python'da ayrılmış bir sözcük olduğunu belirtmeye de değer olabilir. –