2009-09-11 123 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