2013-01-13 30 views
3

我正在嘗試編寫一個python函數,它可以將圖片上任意位置的三角形區域複製到新的空白圖片上。我可以將圖片中的矩形區域複製到新的空白圖片,但我不知道如何複製三角形。這是我的,但它只複製一個矩形區域。對不起,如果它看起來凌亂或過於複雜,但我只是開始如何在Python中編寫。在Python中將三角形區域從一張圖片複製到另一張圖片

def copyTriangle(): 
    file=pickAFile() 
    oldPic=makePicture(file) 
    newPic=makeEmptyPicture(getWidth(oldPic),getHeight(oldPic)) 
    xstart=getWidth(oldPic)/2 
    ystart=getHeight(oldPic)/2 
    for y in range(ystart,getHeight(oldPic)): 
     for x in range(xstart,getWidth(oldPic)): 
      oldPixel=getPixel(oldPic,x,y) 
      colour=getColor(oldPixel) 
      newPixel=getPixel(newPic,x,y) 
      setColor(newPixel,colour) 

回答

2

如果您願意像在您的示例中那樣逐像素地完成,那麼只需複製三角形的像素即可。這主要取決於你想如何定義三角形。

最簡單的三角形是讓你的X系列(內環)依賴於你的y值(外環),如:

for y in range(ystart, ystart+getHeight(oldPic)): 
    for x in range(xstart, xstart + int(getWidth(oldPic)*((y-ystart)/float(getHeight)): 

更一般地,你仍然可以保持你的相同的x和y循環,然後將複製命令放在if塊中,在那裏檢查點是否在三角形中。

除此之外,還有這樣一來,使用口罩更有效的方式,等

注意,這裏也改變了我的Y範圍range(ystart, ystart+getHeight(oldPic)),我認爲這是可能是你想要的高度這並不取決於開始的位置。

+0

@Yve:你是不正確這裏。如果三角形底座在'ystart = 100',並且它的高度爲'5',那麼我的答案'範圍(ystart,ystart + getHeight)=(100,105)',這是正確的,而' ystart,getHeight)= range(100,5)'這是沒有意義的。部分原因在於,這取決於定義,我不知道'h'是什麼意思,但對於'getHeight',我的原始答案是正確的。 – tom10

+0

@伊夫:這很可笑。你只是有效地爲循環做'range(0,h)'並在循環內部添加'ystart'。如果你在循環的範圍內執行它,它是'range(ystart,ystart + getHeight)'。它基本上只是術語的定義,但是在對我的答案進行投票時,詢問是否正確合理,而不是我是在做「1 + 2」而不是「2 + 1」是合理的。 – tom10

+0

@ Yve:好的,所以你似乎在說使用'range(ystart + getHeight(oldPic))'是錯的,但是'range(ystart + getHeight)'是正確的?我有這個權利嗎?那麼,你認爲'getHeight'和'getHeight(oldPic)'之間的區別是什麼? – tom10

4

將三角形區域從一張圖片複製到另一張圖片的功能。

def selectTriangle(pic): 
    w= getWidth (pic) 
    h = getHeight(pic) 
    newPic = makeEmptyPicture(w,h) 
    x0=107#test point 0 
    y0=44 
    x1=52#test point 1 
    y1=177 
    x2=273 #test point 2 
    y2=216 
#(y-y0)/(y1-y0)=(x-x0)/(x1-x0) 

    for y in range (0,h): 
    for x in range (0, w): 
#finding pixels within the plotted lines between eat set of points 
     if (x>((y-y0)*(x1-x0)/(y1-y0)+x0) and x<((y-y0)*(x2-x0)/(y2-y0)+x0) and x>((y-y2)*(x1-x2)/(y1-y2)+x2)): 
     pxl = getPixel(pic, x, y) 
     newPxl= getPixel(newPic,x,y) 
     color = getColor(pxl) 
     setColor (newPxl, color) 

    return (newPic) 

Original Image Triangle

+0

+1:對於一個很好的,完全解決的答案,一個糟糕的陳述的問題。我相信別人會覺得這很有用。 (儘管如此,我的回答沒有錯,但是這樣好多了。) – tom10

相關問題