................. ... .............. ..................
# 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)
........ ....................... ....................... .......
당신 이봐! ;) 당신이 좋아하는 것을 기쁘게 생각합니다. 나는 당신에게 이메일을 보내기 위해 정확하게 새롭게 게시 된 답변 링크를 그룹화했다. 그러나 당신은 이미 그것을 발견했다 ... –
좋아, 그럼 내가 너에게 불어로 쓸거야! –
해야합니다. 정확히 "제곱 된"그림을 입력으로 사용 하시겠습니까? 당신이 얻은 오류는 무엇입니까? 내 대답에 제곱되지 않은 그림을 거부하는 수표를 추가했습니다. 건배. –