只是为了分享一种对角镜像的方式,从左下到右上:
学生负责适应,如果他需要从“右上到左下”镜像或使用相反的对角线。
# !! Works only with squared pictures... !!
def diagMirrorPicture(picture):
height = getHeight(picture)
width = getWidth(picture)
if (height != width):
printNow("Error: The input image is not squared. Found [" + \
str(width) + " x " + str(height) + "] !")
return None
newPicture = makeEmptyPicture(width, height)
mirrorPt = 0
for x in range(0, width, 1):
for y in range(mirrorPt, height, 1):
sourcePixel = getPixel(picture, x, y)
color = getColor(sourcePixel)
# Copy bottom-left as is
targetPixel = getPixel(newPicture, x, y)
setColor(targetPixel, color)
# Mirror bottom-left to top right
targetPixel = getPixel(newPicture, y, x)
# ^^^^ (simply invert x and y)
setColor(targetPixel, color)
# Here we shift the mirror point
mirrorPt += 1
return newPicture
file = pickAFile()
picture = makePicture(file)
picture = diagMirrorPicture(picture)
if (picture):
writePictureTo(picture, "/home/mirror-diag2.png")
show(picture)
注意:这就像我们为每一行像素独立地操作一个垂直镜像,沿着通过mirrorPt 点的垂直轴。
输出(Antoni Tapies 的绘画):
............................................ ......
以下内容是实验性的,仅供娱乐......
# Draw point, with check if the point is in the image area
def drawPoint(pic, col, x, y):
if (x >= 0) and (x < getWidth(pic)) and (y >= 0) and (y < getHeight(pic)):
px = getPixel(pic, x, y)
setColor(px, col)
# Draw line segment given two points
# From Bresenham's line algorithm :
# http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
def drawLine(pic, col, x0, y0, x1, y1):
dx = abs(x1-x0)
dy = abs(y1-y0)
sx = sy = 0
#sx = 1 if x0 < x1 else -1
#sy = 1 if y0 < y1 else -1
if (x0 < x1):
sx = 1
else:
sx = -1
if (y0 < y1):
sy = 1
else:
sy = -1
err = dx - dy
while (True):
drawPoint(pic, col, x0, y0)
if (x0 == x1) and (y0 == y1):
break
e2 = 2 * err
if (e2 > -dy):
err = err - dy
x0 = x0 + sx
if (x0 == x1) and (y0 == y1):
drawPoint(pic, col, x0, y0)
break
if (e2 < dx):
err = err + dx
y0 = y0 + sy
# Works only with squared cropped areas :
# i.e. in [(x0, y0), (x1, y1)], abs(x1-x0) must be equal to abs(y1-y0)
#
# USAGE :
# * To get bottom reflected to top use x0 > x1
# * To get top reflected to bottom use x0 < x1
def diagCropAndMirrorPicture(pic, startPt, endPt):
w = getWidth(pic)
h = getHeight(pic)
if (startPt[0] < 0) or (startPt[0] >= w) or \
(startPt[1] < 0) or (startPt[1] >= h) or \
(endPt[0] < 0) or (endPt[0] >= w) or \
(endPt[1] < 0) or (endPt[1] >= h):
printNow("Error: The input points must be in the image range !")
return None
new_w = abs(startPt[0] - endPt[0])
new_h = abs(startPt[1] - endPt[1])
if (new_w != new_h):
printNow("Error: The input points do not form a square !")
return None
printNow("Given: (" + str(startPt[0]) + ", " + str(endPt[0]) + ") and (" \
+ str(startPt[1]) + ", " + str(endPt[1]) + ")")
newPicture = makeEmptyPicture(new_w, new_h)
if (startPt[0] < endPt[0]):
offsetX = startPt[0]
switchX = False
switchTB = True
else:
offsetX = endPt[0]
switchX = True
switchTB = False
if (startPt[1] < endPt[1]):
offsetY = startPt[1]
switchY = False
else:
offsetY = endPt[1]
switchY = True
# (switchX XOR switchY)
changeDiag = (switchX != switchY)
mirror_pt = 0
for x in range(0, new_w, 1):
for y in range(mirror_pt, new_h, 1):
#for y in range(0, new_h, 1):
oldX = x
oldY = y
if (switchTB):
sourcePixel = getPixel(picture, offsetX+new_w-1- oldX, offsetY+new_h-1- oldY)
else:
sourcePixel = getPixel(picture, offsetX+oldX, offsetY+oldY)
color = getColor(sourcePixel)
if (changeDiag):
newX = new_w-1 - x
newY = new_h-1 - y
#printNow("Change Diag !")
else:
newX = x
newY = y
# Copied half
if (switchTB):
targetPixel = getPixel(newPicture, new_w-1- x, new_h-1- y)
else:
targetPixel = getPixel(newPicture, x, y)
setColor(targetPixel, color)
# Mirror half (simply invert x and y)
if (switchTB):
targetPixel = getPixel(newPicture, new_h-1- newY, new_w-1- newX)
else:
targetPixel = getPixel(newPicture, newY, newX)
setColor(targetPixel, color)
# Here we shift the mirror point
if (not changeDiag):
mirror_pt += 1
return newPicture
file = pickAFile()
pic = makePicture(file)
picture = makePicture(file)
# Draw working area
drawLine(pic, white, 30, 60, 150, 180)
drawLine(pic, white, 30, 180, 150, 60)
drawLine(pic, black, 30, 60, 30, 180)
drawLine(pic, black, 30, 60, 150, 60)
drawLine(pic, black, 150, 60, 150, 180)
drawLine(pic, black, 30, 180, 150, 180)
show(pic)
writePictureTo(pic, "D:\\pic.png")
# Build cropped and mirrored areas
pic1 = diagCropAndMirrorPicture(picture, (150, 60), (30, 180))
pic2 = diagCropAndMirrorPicture(picture, (30, 180), (150, 60))
pic3 = diagCropAndMirrorPicture(picture, (150, 180), (30, 60))
pic4 = diagCropAndMirrorPicture(picture, (30, 60), (150, 180))
# Show cropped and mirrored areas
if (pic1):
writePictureTo(pic1, "D:\\pic1.png")
show(pic1)
if (pic2):
writePictureTo(pic2, "D:\\pic2.png")
show(pic2)
if (pic3):
writePictureTo(pic3, "D:\\pic3.png")
show(pic3)
if (pic4):
writePictureTo(pic4, "D:\\pic4.png")
show(pic4)
..................................................... ...................................................... ......
..............................@ 987654327@.......