1

コマンドラインから画像名を取得し、それをウィンドウに出力し、ユーザーの好みに合わせて再スケーリングする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.pyresize.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: 座標が範囲外です

なぜそう言っているのかよくわかりません...

4

2 に答える 2