python 影象移動與縮放
阿新 • • 發佈:2018-12-21
from PIL import Image from os import listdir import math import numpy as np import cv2 # texture: a texture # offsetX: min U ,not offset distance(=abs(min U)) # offsetY: min V ,not offset distance(=abs(min V)) # usScale: max((maxU-minU),(maxV-minV)) def textureTransform( texture, offsetX, offsetY, uvScale): offsetX = offsetX % 1 offsetY = offsetY % 1 width, height = texture.size #-------------------first deal horizontal-------------------------- AfterXTexture = Image.new(texture.mode, (width, height)) if(offsetX > 0): offsetWidth = int(round(width * offsetX)) region1 = texture.crop((0,0,offsetWidth,height)) region2 = texture.crop((offsetWidth, 0, width, height)) AfterXTexture.paste(region2, box = (0, 0)) AfterXTexture.paste(region1, box = (width-offsetWidth, 0)) elif(offsetX < 0): offsetX = abs(offsetX) offsetWidth = int(round(width * offsetX)) region1 = texture.crop((0, 0, width - offsetWidth, height)) region2 = texture.crop((width - offsetWidth, 0, width, height)) AfterXTexture.paste(region2, box = (0, 0)) AfterXTexture.paste(region1, box = (offsetWidth, 0)) else: AfterXTexture = texture #-------------------second deal vertical-------------------------- AfterYTexture = Image.new(texture.mode, (width, height)) if(offsetY < 0): offsetHeight = int(round(height * offsetY)) region1 = AfterXTexture.crop((0, 0, width, offsetHeight)) region2 = AfterXTexture.crop((0, offsetHeight, width, height)) AfterYTexture.paste(region2, box = (0, 0)) AfterYTexture.paste(region1, box = (0, height-offsetHeight)) elif(offsetY > 0): offsetY = abs(offsetY) offsetHeight = int(round(height * offsetY)) region1 = AfterXTexture.crop((0, height - offsetHeight, width, height)) region2 = AfterXTexture.crop((0, 0, width, height - offsetHeight)) AfterYTexture.paste(region1, box = (0, 0)) AfterYTexture.paste(region2, box = (0, offsetHeight)) else: AfterYTexture = AfterXTexture #-------------------third deal scale-------------------------- finalWidth = int(width * uvScale) finalHeight = int(height * uvScale) finalTexture = Image.new(texture.mode, (finalWidth, finalHeight)) repeat = int(uvScale) for i in range(0, repeat + 1): for j in range(0, repeat + 1): finalTexture.paste(AfterYTexture, box = (j*width, finalHeight-(i+1)*height)) #-------------------fourth return result-------------------------- return finalTexture