Смешивание двух изображений вместе с помощью Jython

Я пытаюсь объединить 2 изображения вместе, и каждый раз, когда я запускаю это, я получаю сообщение об ошибке:

getPixel(picture,x,y): x (= 310) is less than 0 or bigger than the width (= 309)

Значение ошибки:

Inappropriate argument value (of correct type).
An error occurred attempting to pass an argument to a function.
Please check line 18

Я несколько раз менял размеры изображений, чтобы увидеть, будет ли это работать, и это не так. Любая помощь будет здорово.

На данный момент мои фотографии имеют следующие размеры:
Антилопа=310x369
Джеколоп=250x341

def blendPictures():                #define a new function
  Pic1=makePicture(pickAFile())     #Pick Pic1 Antelope(Barb)
  Pic2=makePicture(pickAFile())     #Pick Pic2 Jackalope(Katie)
  canvas=makeEmptyPicture(640,480)  #Create an empty picture file
  sourceX=0
  for targetX in range(0,150):      #Let's ad our first loop
    sourceY=0
    for targetY in range(0,getHeight(Pic1)):
      color = getColor(getPixel(Pic1,sourceX,sourceY))
      setColor(getPixel(canvas,targetX,targetY),color)
      sourceY = sourceY + 1
    sourceX = sourceX +1
  overlap = getWidth(Pic1)-150
  sourceX=0
  for targetX in range(150,getHeight(Pic1)):
    sourceY=0
    for targetY in range(0,getHeight(Pic2)):
      APixel = getPixel(Pic1,sourceX+150,sourceY)
      BPixel = getPixel(Pic2,sourceX,sourceY)
      newRed=0.50*getRed(APixel)+0.50*getRed(BPixel)
      newGreen=0.50*getGreen(APixel)+0.50*getGreen(BPixel)
      newBlue=0.50*getBlue(APixel)+0.50*getBlue(BPixel)
      color=makeColor(newRed,newGreen,newBlue)
      setColor(getPixel(canvas,targetX,targetY),color)
      sourceY=sourceY+1
    sourceX=sourceX+1
  sourceX=overlap
  for targetX in range(150+overlap,150+getWidth(Pic2)):
    sourceY=0
    for targetY in range(0,getHeight(Pic2)):
       color=getColor(getPixel(Pic2,sourceX,sourceY))
       setColor(getPixel(canvas,targetX,targetY),color)
       sourceY=sourceY+1
    sourceX=sourceX+1
  show(canvas)
  return canvas

person Joshua Weeks    schedule 11.12.2016    source источник


Ответы (1)


Я не уверен, что вы пытаетесь сделать, но одной очевидной проблемой является ваш второй раздел цикла:

for targetX in range(150, getHeight(Pic1)):

Это должно быть:

for targetX in range(150, getWidth(Pic1)):

В противном случае вы зациклитесь 219 раз (369-150) в направлении x, что вызовет указанную ошибку в строке:

APixel = getPixel(Pic1, sourceX+150, sourceY)

Потому что на итерации 160 из 219 код попробует getPixel(Pic1, 310, 0), что выходит за пределы.

person Meyer    schedule 11.12.2016
comment
Большое спасибо! Теперь, когда вы указали на это, это очень очевидно. Я не знаю, как долго я смотрел на этот код и не мог понять. Теперь работает идеально. просто нужно получить другую картинку, чтобы она выглядела лучше. Еще раз большое спасибо SMeyer - person Joshua Weeks; 11.12.2016