1

私はPythonを(python3.2を使用して)学習しようとしています。現在、画像を拡大縮小するように設計されたプログラムを作成しています。

from PIL import Image

def newSizeChoice():
    scale = input('Please enter the scale to be applied to the image: x')
    while float(scale) <= 0:
        scale = input('Invalid: scale must be positive. Please enter a new scale: x')
    return float(scale)

def bestFilter(x):
    if x < 1:
        filter = 'ANTIALIAS'
    elif x == 2:
        filter = 'BILINEAR'
    elif x == 4:
        filter = 'BICUBIC'
    else:
        filter = 'NEAREST'
    return filter

def resize(img, width, height, scale, filter):
    width = width * scale
    height = height * scale
    newimg = img.resize((width, height), Image.filter)
    newimg.save('images\\LargeCy.png')
    newimg.show()

img = Image.open('images\\cy.png')
pix = img.load()
width, height = img.size

scale = float(newSizeChoice())
filter = bestFilter(scale)
resize(img, width, height, scale, filter)

まだ作業中なので、今は少し混乱していますが、問題は、関数'bestFilter'でフィルターを設定すると、関数'でフィルターを設定するために使用できないことです。サイズ変更'。私が得続けるエラー:

Traceback (most recent call last):
  File "C:\Users\14davidson_a\Desktop\Projects\Exercises\ImageScaling.py", line 33, in <module>
    resize(img, width, height, scale, filter)
  File "C:\Users\14davidson_a\Desktop\Projects\Exercises\ImageScaling.py", line 23, in resize
    newimg = img.resize((width, height), Image.filter)
AttributeError: 'module' object has no attribute 'filter'

質問:文字列を使用してモジュールの属性を設定する方法はありますか?

4

1 に答える 1

1

Image.filterモジュールで定義されていないを使用しようとしていImageます。おそらくfilter、代わりにメソッドの引数を使用するつもりでしたか?

def resize(img, width, height, scale, filter):
    width = width * scale
    height = height * scale
    newimg = img.resize((width, height), filter)
    newimg.save('images\\LargeCy.png')
    newimg.show()

filterそのメソッドの他の目的には引数を使用しません。

有効なフィルターbestFilter()を返すには、関数を更新する必要があります。Image

def bestFilter(x):
    if x < 1:
        filter = Image.ANTIALIAS
    elif x == 2:
        filter = Image.BILINEAR
    elif x == 4:
        filter = Image.BICUBIC
    else:
        filter = Image.NEAREST
    return filter

マッピングを使用して、その関数を単純化できます。

_scale_to_filter = {
    1: Image.ANTIALIAS,
    2: Image.BILINEAR,
    4: Image.BICUBIC,
}
def bestFilter(x):
    return _scale_to_filter.get(x, Image.NEAREST)
于 2012-11-28T13:46:25.720 に答える