2014-11-06 35 views
4

我想讓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值。

+0

什麼是StreamIO? – 2014-11-10 14:21:51

+0

你能提供一個可運行的代碼嗎?即ImageFile未定義,搜索沒有數字等。 – 2014-11-10 14:22:41

+0

@HuguesFontenelle,StringIO也被[PIL文檔]使用(http://effbot.org/imagingbook/image.htm#tag-Image。打開)。我認爲如果沒有文件存在,這將是打開圖像數據流的正確途徑。我將在今天晚些時候添加一個帶有示例圖片的可運行代碼。 – ap0 2014-11-10 14:24:38

回答

-1

我並不真正瞭解流式傳輸,但我認爲您根本無法像您那樣訪問rgb值。 嘗試:

rgb_im = img.convert('RGB') 
r, g, b = rgb_im.getpixel((i, j)) 
0

我會像TGA未壓縮格式嘗試。 JPG是一種壓縮格式,從不完整的圖像中提取像素可能沒有任何意義。 JPEG實際存儲描述圖像的方程的參數,而不是像素值。當您查詢JPEG像素值時,它將評估該點處的方程並返回結果。

+0

不幸的是我必須找到一種方法來處理JPEG。 – ap0 2014-11-17 08:55:20