コマンドラインから画像名を取得し、それをウィンドウに出力し、ユーザーの好みに合わせて再スケーリングするpythonコードに取り組んでいます。つまり、入力python3.2 resize.py image.gif 2 3は画像を取得します。 gif、幅を 2 倍、高さを 3 倍にします。画像を4倍にするコードを書きました:
import sys
from cImage import *
def main():
oldImage = FileImage(sys.argv[1])
width = oldImage.getWidth()
height = oldImage.getHeight()
myWin = ImageWin("Old Image", width, height)
myNewWin = ImageWin("Quadrupled Image", width*4, height*4)
newImage = EmptyImage(width*4, height*4)
for r in range(width):
for c in range(height):
pixel = oldImage.getPixel(r, c)
newImage.setPixel(4*r, 4*c, pixel)
newImage.setPixel(4*r, 4*c+1, pixel)
newImage.setPixel(4*r, 4*c+2, pixel)
newImage.setPixel(4*r, 4*c+3, pixel)
newImage.setPixel(4*r+1, 4*c, pixel)
newImage.setPixel(4*r+1, 4*c+1, pixel)
newImage.setPixel(4*r+1, 4*c+2, pixel)
newImage.setPixel(4*r+1, 4*c+3, pixel)
newImage.setPixel(4*r+2, 4*c, pixel)
newImage.setPixel(4*r+2, 4*c+1, pixel)
newImage.setPixel(4*r+2, 4*c+2, pixel)
newImage.setPixel(4*r+2, 4*c+3, pixel)
newImage.setPixel(4*r+3, 4*c, pixel)
newImage.setPixel(4*r+3, 4*c+1, pixel)
newImage.setPixel(4*r+3, 4*c+2, pixel)
newImage.setPixel(4*r+3, 4*c+3, pixel)
oldImage.draw(myWin)
newImage.draw(myNewWin)
myWin.exitOnClick()
myNewWin.exitOnClick()
main()
しかし、コードを編集して要求どおりにスケーリングする方法を理解するのに苦労しています。おそらく for ループを実装できるはずだと思いますが、機能させるのに苦労しています。
どんな助けでも大歓迎です!編集:
次の変更されたコードを使用しています。
from cImage import *
import sys
def main():
oldImage = FileImage(sys.argv[1])
oldWidth = oldImage.getWidth()
oldHeight = oldImage.getHeight()
widthScalar = int(sys.argv[2])
heightScalar = int(sys.argv[3])
newWidth = oldWidth * widthScalar
newHeight = oldHeight * heightScalar
myWin = ImageWin("Old Image", oldWidth, oldHeight)
myNewWin = ImageWin("Scaled Image", newWidth, newHeight)
newImage = EmptyImage(newWidth, newHeight)
for r in range(oldHeight*heightScalar):
for c in range(oldWidth*widthScalar):
pixel = oldImage.getPixel(r // heightScalar, c // widthScalar)
newImage.setPixel(r, c, pixel)
oldImage.draw(myWin)
newImage.draw(myNewWin)
myWin.exitOnClick()
myNewWin.exitOnClick()
main()
私はまた、より複雑な方法を使用してみました:
for r in range(oldHeight):
for c in range(oldWidth):
pixel = oldImage.getPixel(r,c)
for i in range(heightScalar):
for j in range(widthScalar):
myNewImage.setPixel((heightScalar*r)+i, (widthScalar*c)+j, pixel)
等しいスカラー (つまり 3 x 3) でテストしたところ、正方形の画像では問題なく動作しましたが、そのうちの 1 つを変更しようとすると、エラーが発生します。
ValueError: ピクセル インデックスが範囲外です。
正方形ではない画像を試してみると、座標が範囲外であるというエラーが発生しました。
何をすればいいのか途方に暮れています... abarnert さん、ご協力ありがとうございます。————————————————————————————————————————————— 行ってきました私のquadruple.pyとresize.pyの両方をテストし、正方形の画像で動作しますが、正方形以外の画像を入れると、次のようになります。
ピクセル = oldImage.getPixel(r, c)
ファイル "/Users/jakebenedict/CPS/Lab6/cImage.py"、313 行目、getTkPixel 内
p = [self.im.get(x,y).split() の j の int(j)]
ファイル "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/tkinter/ init .py"、行 3260、get 内
return self.tk.call(self.name, 'get', x, y)
_tkinter.TclError: pyimage1 get: 座標が範囲外です
なぜそう言っているのかよくわかりません...