0

一部の Delphi コードを Python PIL に変換しようとしています。問題は二股です。まず、私は Delphi プログラマーではありません。第二に、私は今日まで 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:=@Row[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 値を抽出する Python PIL コードがいくつかありますが、RGB 値のタプルが以前のコードで取得した PB 変数とどのように比較されるかわかりません。いくつかの実験に基づいて、私はそれがまったく比較できないと推測しています.

前もって感謝します。

4

2 に答える 2

1

誰かが後でこれを行おうとしている場合に備えて。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))
于 2012-09-02T22:51:17.570 に答える
-1

使用している変数がどのように定義されているかを示すと、それらを使用して何をしようとしているのかを確認できます。とはいえ、ScanLineプロパティは、ピクセルを表すバイトを表す配列です。そうは言っても、バイト数を決定するには、caseステートメントのような小さな関数が必要です。ただし、バイト配列へのポインタとして各ScanLineをプルオフする必要があります。

したがって、ScanLine配列のエントリ数はBitmap1.Heightです。これは、その部分が正しいことを意味します。しかし、残りは少し異なります。rowという名前の変数をポインターとして定義するとします。次に、配列内の特定のピクセルを見つけるには、それに応じて別のポインターを設定する必要があります。

それは非常に軽くテストされているので、これがそれを得るかどうかはわかりません。プルバックしていたピクセルデータを表すためにLongintを使用しました。RGBデータを引き出すには、より適切なものを使用しますが、これがScanLineプロパティを処理して、必要なピクセルデータを取得する方法を示していることを願っています。

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;
于 2012-09-02T02:32:47.907 に答える