Delphi TBitmap code to Python PIL



我正在尝试将一些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值。我习惯于提取颜色值的最低有效位。然而,我甚至不确定现有代码正在提取什么。我有一些python PIL代码,它将提取同一图像中每个像素的RGB值,但我不知道RGB值的元组与早期代码中获得的PB变量相比如何。根据一些实验,我猜它根本无法比较。

提前谢谢。

以防以后有人试图这样做。感谢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))

展示您正在使用的变量是如何定义的,这样我们就可以看到您正在尝试如何使用它们。也就是说,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;

相关内容

  • 没有找到相关文章

最新更新