4

画像を水平方向に反転しようとしています。

これから:

元の写真

これに:

反転した写真

しかし、私はそれを途中でミラーリングし続けています。

このような:

私が得る結果

x 軸のインデックスを逆にしようとしていますが、分割されている理由がわかりません。

def flip(picture):
    height = getHeight(picture)
    width = getWidth(picture)
    newPicture = makeEmptyPicture(width, height)
    x2 = width-1
    for x in range(0, width):
        y2 = 0
        for y in range(0, height):
            pxl = getPixel(picture, x, y)
            newPxl = getPixel(picture, x2, y2)
            color = getColor(pxl)
            setColor(newPxl, color)
            y2 = y2+1
        x2 = x2-1
    return picture

私のコードの残りの部分:

def d():    
    f = pickAFile()
    picture = makePicture(f)        
    newPicture = copy(picture)        
    writePictureTo(newPicture, r"D:\FOLDER\newPic4.jpg")
    explore(newPicture)
4

4 に答える 4

5

あなたのflip()関数では(他の関数と同様に)、他の回答で述べたようにpicture、関数のパラメーターとして渡されたがd()で定義されている画像を返します...

これはscope変数の問題なので、ここで行った議論をもう一度見てください

ここでは、2 つの選択肢がありました (2 つの間で融け合いました)。

  • picture指定されたパラメーターを直接変更する
  • を作成しnewPicture、変更して、最後に返す

2d オプションの詳細:

ここで重要なことは、picture変数が関数に属しているd()ことです (d() がそのスコープです)。その間、newPicture変数は関数に属しflip()ます (flip() はそのスコープです)。そのため、newPicture の有効期間は flip() です (つまり、flip() 関数の実行を終了して戻るとすぐに破棄されます)。また、d() は、この newPicture を d() に返さない限り、何も知りません。

つまり、要するに (2 番目のオプションについて話していると仮定して):

1)パラメータとして受け取る関数を作成pictureします (flip())

2) flip() 内で、ローカル変数を作成し、元の変数が変更newPictureされないように、その変数のみを変更します。picture

3)新しく更新さnewPictureれた を親に返しscopeます。ここで d() は flip() を呼び出しているので、それが親スコープです。Flip() によって返されたものを保持するために、3d 変数 (d() スコープに属する) を作成する必要があります。

def flip(picture)
    # Create newPicture
    # Modify newPicture (using the information from the "picture" parameter)
    setColor(newPicture, ...)
    ...
    return newPicture

def d():
    file = PickAFile()
    original_pic = makePicture(file) 
    finalNewPicture = flip(original_pic)     # {1}
    show(finalNewPicture)

{1}: ここでは、flip によって返された値 (つまりnewPicture) を、より高いスコープfinalNewPicture(ハンドラー) の変数に割り当てます...

この背後にあるロジックを理解するのに役立つことを願っています。それはロシアの人形のようなものです: newPicture は Flip() 内で使用され、d() 内で使用されます...


編集 :

1番目のオプションについても説明したいと思います...

1)パラメータとして受け取る関数を作成pictureします (flip())

2) flip() 内で、より高いスコープのpicture変数を直接変更します

3) Flip() から何も返さない

これにより、次のようになります。

def flip(picture)
    # Simply modify the variable "picture", given as a parameter
    setColor(picture, ...)
    ...
    # Do not return anything

def d():
    file = PickAFile()
    original_pic = makePicture(file) 
    flip(original_pic)                     # {1}
    show(original_pic)

{1}: ここで、flip() は入力画像に直接変更を加えたので、変更された元の画像を直接表示できます ( original_pic)。中間ハンドラー変数は必要ありません。


オプション 1 のコード: (既にオプション 2 で動作しているため)

def flip(picture):
  height = getHeight(picture)
  width = getWidth(picture)

  x2=width-1
  for x in range(0, width/2):   # Only process the half way
    y2=0
    for y in range(0, height):
      # swap pix and pix2
      pxl = getPixel(picture, x, y)
      pxl2 = getPixel(picture, x2, y2)
      color = getColor(pxl)
      color2 = getColor(pxl2)
      setColor(pxl2, color)
      setColor(pxl, color2)
      y2=y2+1
    x2=x2-1  

def d():    
  f = pickAFile()
  original_picture = makePicture(f)        
  flip2(original_picture)        
  show(original_picture)

d()

注:フリップは、次のように大幅に単純化できます。

def flip2(picture):
  height = getHeight(picture)
  width = getWidth(picture)

  for x in range(0, width/2):   # Only process the half way
    for y in range(0, height):
      # swap pix and pix2
      pxl = getPixel(picture, x, y)
      pxl2 = getPixel(picture, width-1-x, y)
      color = getColor(pxl)
      color2 = getColor(pxl2)
      setColor(pxl2, color)
      setColor(pxl, color2)
于 2013-07-03T16:47:14.637 に答える