Python图像镜像
我正在制作一个图片的水平和垂直镜像效果。现在我想要制作对角线的镜像。
之前我做水平和垂直镜像时,使用了两个循环。在水平镜像的情况下,我会遍历图片的高度所有像素,而宽度只遍历一半的像素。然后我获取这个像素的颜色,并把同样的颜色设置到另一边的像素上。这个过程是从图片的宽度开始,一直到中间。
这样我就得到了图片中间的镜像效果。那么,如何实现对角线的镜像呢?
编辑:
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)
4 个回答
1
这其实不是一个关于Python的问题,对吧?
最简单的解决办法是先把图像水平翻转,然后再垂直翻转。
另一种方法是把像素的行和列互换。
或者你可以按照自己的算法来做,但把像素从左上角换到右下角...
3
使用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')
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)
这个方法应该有效,但还没有经过测试。