2012-09-02 3 views
0

일부 Delphi 코드를 Python PIL로 변환하려고합니다. 문제는 두 갈래로 나뉜다. 첫째, 저는 델피 프로그래머가 아닙니다. 둘째, 오늘 전까지 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 값으로 시각화하는 경향이 있다는 것입니다. 저는 색상 값의 최하위 비트를 추출하는 데 익숙합니다. 그러나 기존 코드가 무엇을 추출하는지 확신 할 수 없다고 생각합니다. 동일한 이미지에서 각 픽셀의 RGB 값을 추출 할 파이썬 PIL 코드가 있지만 RGB 값의 튜플이 이전 코드에서 얻은 PB 변수와 어떻게 비교되는지 모르겠다. 몇 가지 실험을 토대로 필자는 그것이 전혀 비교되지 않는다고 추측한다.

미리 감사드립니다.

+0

"가장 중요한 바이트의 최하위 비트가 어느 채널에서 왔는지"라는 질문에 대한 답변입니다. 그것은 잘 정의되어 있지만, 내 인생이 그 정보가 왜 유용 할 수 있는지 이해할 수는 없습니다. 적색 채널 값이 홀수인지 여부를 언제 알고 싶습니까? –

+0

@David,이 게시물의 코드가 너무 이상해서 Google에 그 코드가 있어야했습니다. 이 게시물의 코드가 동일하기 때문에 ['steganography'] (http://itte.no/delphi/Steganography.htm)가 될 것입니다. user1641230,이 주석에 링크 된 페이지에서 찾을 수있는 답변. 흥미 진진한 기술 어쨌든 ... – TLama

+0

@ TLama, 당신은 정확합니다, 그것은 스테가 노 탐지를위한 것이 었습니다. – user1641230

답변

-1

사용중인 변수가 정의 된 방식을 보여줌으로써 사용자가 수행하려고하는 것을 볼 수 있습니다. 즉, ScanLine 속성은 픽셀을 나타내는 바이트를 나타내는 배열입니다. 즉, 바이트 수를 결정하기 위해 case 문과 같은 작은 함수가 필요합니다. 하지만 각 ScanLine을 바이트 배열에 대한 포인터로 가져와야합니다.

그래서 ScanLine 배열의 항목 수는 Bitmap1.Height입니다. 즉, 해당 부분이 올바르게 있음을 의미합니다. 그러나 나머지는 조금 다릅니다. 행이라는 변수를 포인터로 정의한다고 가정 해 보겠습니다. 그런 다음 배열의 특정 픽셀을 찾으려면 그에 따라 다른 포인터를 설정해야합니다.

매우 가볍게 테스트 되었기 때문에이 문제가 발생하는지 확실하지 않습니다. 방금 가져온 픽셀 데이터를 나타내는 Longint를 사용했습니다.

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, Ken이 맞습니다. Delphi 코드는 이미 게시 된 상태로 작동합니다. 파이썬에서 부분을 다시 구현해야한다. 나는 그것의 대부분을 (내가 생각하는) 작동하지만 핵심 문제는 구체적으로 내 원래 코드의 PB 변수를 참조하는 이해가되지 않는다는 것입니다. 픽셀을 가리키고 있습니까? 그렇다면 R, G 또는 B 값이 구체적으로 (또는 다른 것) 있습니까? – user1641230

+0

PB가 색상 채널을 가리 킵니다. 바이트에 대한 포인터입니다. 내가 믿는 빨간 채널입니다. 16 비트 컬러에서는 파란색 채널의 마지막 3 비트와 빨간색의 5 비트입니다. 그래서 저는 여러분의 코드가 항상 적색 채널의 최하위 비트를 선택했다고 생각합니다. –

1

의 경우 사람에 노력하고있다 : 귀하의 요구는 RGB 데이터를 꺼내, 그러나 희망이 당신이 그것에서 필요로하는 픽셀 데이터를 얻을 수 주사선 속성을 처리하는 방법을 보여줍니다에 대한 좀 더 맞는 뭔가를 사용하십시오 나중에이 작업을 수행하십시오. ScanLine이 돌아오고 있음을 명확히하는데 도움을 주신 David 께 감사드립니다.

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))