2012-09-02 34 views
0

我想將一些Delphi代碼轉換爲Python PIL。問題是兩個方面。首先,我不是Delphi程序員。其次,今天之前我還沒有使用PIL,所以我可能在任何一個領域都有問題。Delphi TBitmap代碼到Python PIL

case PixelFormat of 
    pf32bit: PixSize:=4; 
    pf24bit: PixSize:=3; 
    pf16bit: PixSize:=2; 

end; 
BitCounter:=0; 
for i:=0 to Height-1 do begin 
    Row:=ScanLine[i]; 
    PB:[email protected][PixSize-1]; 
    for j:=0 to Width-1 do begin 
    Ch[BitCounter] := (PB^ and 1); 
    .... 
    inc(BitCounter); 
    inc(PB, PixSize); 
end; 

所以我得到PixelFormat屬性表示每個像素的字節大小。我也知道ScanLine方法應該得到一個表示線條的像素數組。我沒有得到的是我傾向於將每個像素視爲RGB值。我習慣於提取顏色值的最低有效位。但是,我不認爲我甚至不知道現有的代碼正在提取什麼。我有一些Python PIL代碼可以提取同一圖像中每個像素的RGB值,但我不知道RGB值的元組如何與前面代碼中獲得的PB變量進行比較。根據一些實驗,我猜測它根本沒有比較。

在此先感謝。

+0

你的問題歸結爲「從哪個通道是最高有效字節的最低有效位」。這是明確的,但我不能理解爲什麼這些信息會有用。您何時想知道紅色通道值是否爲奇數? –

+0

@David,這篇文章的代碼太奇怪了,我不得不穀歌。它將用於['steganography'](http://itte.no/delphi/Steganography.htm),因爲這篇文章的代碼是相同的。 user1641230,您可以在我在此評論中鏈接的頁面上找到答案。無論如何,有趣的技術...... – TLama

+0

@TLama,你是對的,它是用來檢測隱寫的。 – user1641230

回答

-1

這將有助於顯示您正在使用的變量是如何定義的,以便我們可以看到您正在嘗試使用它們。也就是說,ScanLine屬性是一個代表像素字節的數組。也就是說,你需要一個像case語句這樣的小函數來確定字節數。但是您需要將每個ScanLine作爲指向字節數組的指針關閉。

因此,ScanLine數組中的條目數是Bitmap1.Height,這意味着您有該部分的權利。但其餘的有點不同。假設我們將一個名爲row的變量定義爲一個指針。然後爲了在數組中找到一個特定的像素,你必須相應地設置另一個指針。

不確定這是否得到它,因爲它是非常輕微的測試。我只是用Longint來表示我拉回來的像素數據。你會使用的東西更貼合您的需求拔出RGB數據,但希望這說明如何處理掃描線屬性來獲取你需要出它的像素數據:

var 
    i, j: integer; 
    row: pointer; 
    pixel: pointer; 
    pixelsize: integer; 
    thepixel: longint; 
begin 
    for i := 0 to (Image1.Picture.Height - 1) do 
    begin 
     row := Image1.Picture.Bitmap.ScanLine[i]; 
     pixelsize := GetPixelSize(Image1.Picture.Bitmap.PixelFormat); 
     pixel := row; 
     for j := 0 to (Image1.Picture.Width - 1) do 
     begin 
      thepixel := Longint(Pixel^); 
    //  Memo1.Lines.Add(IntToHex(thepixel, 12)); 
      Inc(Longint(Pixel), pixelsize); 
     end; 
    end; 
end; 
+2

這是如何解決所問的問題(如何將Delphi轉換爲Python PIL **)?您基本上只是將Delphi代碼重寫爲不同的Delphi代碼表示形式。 –

+0

@Glenn,肯是對的。 Delphi代碼已經發布。我不得不在Python中重新實現它的一部分。我大部分工作(我認爲),但核心問題是我不明白什麼特別是我的原始代碼中的PB變量引用。它指向一個像素嗎?如果是這樣,是R,G還是B值專門(或其他)? – user1641230

+0

PB指向一個顏色通道。這是一個指向字節的指針。這是我相信的紅色通道。我相信,在16位顏色中,它是藍色通道的最後3位和紅色的5位。所以我認爲你的代碼總是選出紅色通道的最低位。 –

1

如果有人試圖稍後再做。感謝David幫助澄清ScanLine返回的內容。

from PIL import Image 
img = Image.open('picture.gif') 
(width, height) = img.size 
conv = img.convert("RGB").getdata() 
bt = [] 
for h in range(height): 
    for w in range(width): 
    pixel = conv.getpixel((w, h))[0] # getpixel returns a tuple (R,G,B) 
    bt.append((pixel & 0x1))