3

PILを呼び出して画像をthumbnail()し、次にcrop()を呼び出すと、ピクセルの最後の行にアーティファクトが発生します。ピクセルの大部分は黒で、濃い色の斑点があるか、サイズ変更されていない領域のようです。画像の(つまり、そのピクセルの線は元の解像度であり、残りの部分と一緒に縮小されませんでした)

これは、切り抜きのないthumbnail()では発生しないようです。これは、トリミングされた画像でload()を呼び出すかどうかに関係なく発生します。

これを視覚的に回避するために、私は1ピクセル大きい画像にサムネイルを作成してから、同じサイズにトリミングしています。それはうまくいくようです。しかし、それは一種の汚いハックです。適切な修正があるかどうか疑問に思います。

4

1 に答える 1

2

はい、これは私にも起こります。PIL を使用してサムネイルをトリミングしたり作成したりしたことがないので、これは私にとって学習課題でした...

サムネイル (サイズ、フィルター = なし)

元の画像を所定のサイズ (p. 2) の新しい画像に置き換えます。オプションのフィルター引数は、.resize() メソッドと同じように機能します。この操作により、縦横比 (高さ:幅) が維持されます。結果の画像は、指定されたサイズに収まりながら、可能な限り大きくなります。たとえば、画像 im のサイズが (400,150) の場合、 im.thumbnail((40,40)) 後のサイズは (40,15) になります

だから何が起こっているのかというと

  1. アスペクトを維持するサムネイルを使用します
  2. 画像が 40 x 40 であることを期待しています
  3. サムネイルの実際のサイズを超えてトリミングしています
  4. サイズを超えてトリミングされているため、下部に黒い帯が見られる可能性があります

問題を繰り返すために私が書いたコード:

def croptest(file, width, height):
    import Image as pil
    import os

    max_width = width
    max_height = height
    file, ext = os.path.splitext(file)

    img = pil.open(file)
    img.thumbnail((max_width, max_height), pil.ANTIALIAS)
    img.save(file + ".thumb.jpeg", 'JPEG')
    croppedImage = img.crop((10, 10, 40, 40))
    croppedImage.save(file + ".croppedthumb.jpeg", 'JPEG')

if __name__ == "__main__":
   croptest("Desktop.bmp", 50, 50)

Desktop.thumb.jpeg は 50 x 37 でしたが、Desktop.croppedthumb.jpeg は 30 x 30 だったので、下部に 3 ピクセルの高さの黒い線がありました。

解決策は、サムネイルの実際のサイズ内でトリミングするか、アスペクト比を無視してサムネイルを作成する方法を見つけることです。

于 2010-02-22T21:58:46.000 に答える