我想讓Python 2.7 PIL庫使用JPEG圖像,這些圖像只能作爲來自HDD映像的流使用,並且不完整。使用帶PIL的截斷圖像
我已經設置的選項:
ImageFile.LOAD_TRUNCATED_IMAGES = True
並儘可能加載流,因爲它是可用的(或更好說:據我100%肯定這一數據仍然是一個形象,而不是一些其他文件類型)。我已經測試了不同的東西,據我所知(對於JPEG),PIL只有在它發現0xFFDA
(掃描標記開始)時才接受它作爲有效的JPEG圖像。這是我如何加載這些數據很短的例子:
from PIL import Image
from StringIO import StringIO
ImageFile.LOAD_TRUNCATED_IMAGES = True
with open("/path/to/image.raw", 'rb') as fp:
fp.seek("""jump to position in image where JPEG starts""")
data = fp.read("""number of bytes I know that those belong to that jpeg""")
img = Image.open(StringIO(data)) # This would throw exception if the data does
# not contain the 0xffda marker
pixel = img.load() # Would throw exception if LOAD_TRUNCATED_IMAGES = false
height,width = img.size
for i in range(height):
for j in range(width):
print pixel[i,j]
在最後一行我的預期(或希望)看到至少要顯示的讀像素數據。但是對於每個像素,它都會返回(0,0,0)
。
問題:是我在這裏嘗試不可能與PIL?
幾個星期前,我試圖用截斷自己的圖像文件,只是通過用編輯器剪切數據。它適用於可用的像素數據。一旦它達到我切斷的像素,程序就會拋出一個異常(我今天晚些時候會再試一次,以確保我不記得錯誤)。
如果有人想知道爲什麼我這樣做:我需要確保該硬盤映像中的圖像/圖片處於連續的塊/簇並且沒有碎片。爲了確保這一點,我想使用像素匹配。
編輯: 我再次嘗試過,這就是我所看到的。
我在GIMP打開截斷的圖像,並將其顯示在我的上半部分的幾個像素線,但PIL沒能至少給我的那些像素的RGB值。它總是返回(0,0,0)。
我將圖像做得稍微大一些,使得圖像的較低4/5不可見,但這足以讓PIL向我展示可用的RGB值。其他一切都是(0,0,0)。
即使只有查看像素數據可用,我仍然不能100%確定PIL是否可以顯示RGB值。
什麼是StreamIO? – 2014-11-10 14:21:51
你能提供一個可運行的代碼嗎?即ImageFile未定義,搜索沒有數字等。 – 2014-11-10 14:22:41
@HuguesFontenelle,StringIO也被[PIL文檔]使用(http://effbot.org/imagingbook/image.htm#tag-Image。打開)。我認爲如果沒有文件存在,這將是打開圖像數據流的正確途徑。我將在今天晚些時候添加一個帶有示例圖片的可運行代碼。 – ap0 2014-11-10 14:24:38