1. 程式人生 > >python 影象移動與縮放

python 影象移動與縮放

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