2009-09-11 205 views
0

我一直在水平和垂直軸上製作鏡像鏡像。現在我要製作對角線。Python鏡像鏡像

我已經完成了hori和verti寬度兩個循環,它們在hori場景中循環遍歷高度中的所有像素,並且只遍歷寬度中的一半像素。然後獲取像素的顏色,並將顏色設置爲另一側的像素。從getWidth(pic)到中心。

然後我有我的鏡子在圖片中間。如何做對角線的方式?

編輯:

img_src = makePicture(pickAFile()) 
W = getWidth(img_src) 
H = getHeight(img_src) 

for x in range(W): 
     for y in range(H): 
       p = getPixel(img_src, x, y) 
       colorInSrc = getColor(getPixel(img_src, x, y)) 
       destPixel = getPixel(img_src, H-y-1, W-x-1) 
       setColor(destPixel, colorInSrc) 
+0

這似乎不是一個非常蟒蛇的問題,但只是算法如何操縱矩陣。沒有什麼特別的語言「如何做」。最佳的解決方案/算法是交叉語言 – DrFalk3n 2009-09-11 12:38:57

+0

我不確定getPixel和setColor做什麼,但看起來您正在修改相同的圖像。在我的例子中,你需要創建一個新的圖像,其寬度和高度相反(即原始圖像的高度將成爲新圖像的寬度),並設置新圖像上的像素。如果您只想保持相同的寬度和高度並修改相同的圖像,請按照Sven Hecht的說法進行操作,並使用您現有的代碼在同一圖像上垂直翻轉然後水平翻轉。 – rslite 2009-09-14 12:59:10

回答

1

如果我理解正確的,你需要的是一個對角線「翻轉」的形象。由於其中有兩個,我認爲你的意思是從左下到右上的那個。

爲了翻轉這個對角線,你需要在目的地的列中轉換來自源的每一行。行的左側部分將成爲新列的底部部分。最上面的一行也將成爲最右邊的一列。您需要在整個圖像上逐像素地進行此操作。另外請記住,圖像的寬度和高度將被交換。

編輯:一個小例子。假設您從5像素寬和3像素高(5x3)的圖像開始。您將需要創建一個3像素寬和5像素高的新空白圖像。如果你從(0,0)的左上角開始像素編號,那麼這個像素將在新的圖像中以(2,4)結束,像素(1,0)將以(2,3) ) 等等。

如果你的原始寬度和高度分別爲W和H,那麼你應該使用這樣的:

for x in xrange(W): 
    for y in xrange(H): 
     p = img_src.getpixel(x, y) 
     img_dest.setpixel(H-y-1, W-x-1) 

這應該工作,但沒有進行測試。

+0

我明白了,但我仍然不確定程序的構建方式。 我需要for-loops? (0,getHeight(pic): 那麼我該如何翻轉像素呢?它在dos對象的對角線上有問題嗎?左上角到右下角或者從左下角到右上角 – Jafu 2009-09-11 12:03:20

+0

你需要一個新的圖像來設置像素,請稍後參考我的編輯 – rslite 2009-09-11 12:19:12

+0

謝謝,我現在貼上我的代碼,但是不工作,是因爲非方形圖片? – Jafu 2009-09-11 12:49:51

1

它不是一個真正的Python的問題,是什麼呢?

最簡單的解決方案將首先鏡像水平,然後垂直。 另一種方法是用列切換像素行。

還是做你的算法,但是從左上方像素切換到右下角...

+0

引用Sven。最簡單的方法是沿水平方向而不是垂直方向鏡像。 – DrFalk3n 2009-09-11 12:36:37

2

使用PIL(Python影像庫)這是一個相對簡單的任務。但請注意,輸出圖像是方形的 - 因此與原始圖像的尺寸不一樣。

下面是代碼:

from PIL import Image, ImageDraw 

# load the image, create the mirrored image, and the result placeholder 
img = Image.open('img.png') 
mirror = img.transpose(Image.FLIP_LEFT_RIGHT).transpose(Image.ROTATE_90) 
sz  = max(img.size + mirror.size) 
result = Image.new(img.mode, (sz,sz)) 
result.paste(img, (0,0)+img.size) 

# now paste the mirrored image, but with a triangular binary mask 
mask = Image.new('1', mirror.size) 
draw = ImageDraw.Draw(mask) 
draw.polygon([0,0,0,sz,sz,sz], outline='white', fill='white') 
result.paste(mirror, (0,0)+mirror.size, mask) 

# clean up and save the result 
del mirror, mask, draw 
result.save('result.png') 
+0

謝謝,但我只使用JES,它是學生的一個程序aka noobs ...所以你的版本可能對其他人來說是有意義的:) – Jafu 2009-09-11 14:20:32

0

下面是如何在JES斜鏡;它只適用於一個方形圖像:

def mirrorDiagonal(picture): 
    for sourceX in range(0,getWidth(picture)): 
    for sourceY in range (0,getHeight(picture)): 
     pex=getPixel(picture,sourceY,sourceX) 
     pix=getPixel(picture, sourceX,sourceY) 
     color=getColor(pix) 
     setColor(pex,color) 
    show(picture) 
+0

應該也適用於其他形狀。 – Michael 2012-10-02 07:39:04