0

Image.filter(ImageFilter.BLUR) メソッドを使用して画像をぼかしているときに問題が発生しました。

私のコード:

#Open the image from the ImageField
fp_big = open(self.image_big.path, 'rb')
im_big = Image.open(StringIO(fp_big.read()))

#Resize the image
im_big.thumbnail(size_big, Image.ANTIALIAS)

#Blur the image
im_big = im_big.convert('RGB')
for i in range(10):
    im_big = im_big.filter(ImageFilter.BLUR)

#Save the images
temp_handle_big = StringIO()
im_big.save(temp_handle_big, PIL_TYPE)
temp_handle_big.seek(0)

#Save image to a SimpleUploadedFile which can be saved into ImageField
suf_big = SimpleUploadedFile('%s' % os.path.split(self.image_big.name)[-1], temp_handle_big.read(), content_type=IMG_TYPE)

#Delete old images and close fps
fp_big.close()
os.remove(original_path_big)

このコードは正常に動作しますが、結果は部分的に間違っています。

画像のサイズ変更 ぼやけた画像

ご覧のとおり、画像のエッジは適切にぼやけていません。なぜこれが起こるのか誰にも分かりますか?

事前にt​​hx。

4

1 に答える 1

0

これは、フィルタリングライブラリのバグのようです。多くのフィルターは、基本的に「任意のピクセルはそれ自体とそれを囲むピクセルのさまざまな組み合わせの組み合わせ」を実行するNxNマトリックスを使用します。

しかし、画像の端に到達したらどうしますか?マトリックスがエッジと重なり、無効な結果が得られるため、PILは単にフィルターを適用していないようです。1回の反復だけではおそらく目立たないでしょうが、10回の反復では...すごい!

私の提案は、隣接するピクセルの色をコピーし、フィルターを適用してから、それらを切り抜くことによって、その側の画像のエッジを1〜2ピクセル拡張することです。

または、サムネイルを必要以上に大きくし、フィルタリングしてからトリミングします。その方法で一部のデータが失われますが、より簡単な解決策です。

于 2012-11-22T21:40:20.507 に答える