Для работы мне нужно изменить размеры сотен изображений, чтобы они соответствовали холсту 830x1000 пикселей, сохраняя при этом пропорции (чтобы изображение не растягивалось и не искажалось).Я написал скрипт на Python, используя PIL.Это работает для большинства изображений, но есть некоторые размеры изображений, которые искажаются после запуска сценария.
Я знаю, что проблема заключается в выражении case, но я точно не знаю, где оно.
def resize():
openFiles = glob.glob('*.jpg')
for files in openFiles:
inFile = Image.open(files)
fileName = os.path.splitext(files)[0] # gets filename
outFile = fileName + ".jpg"
print (fileName)
print ("Original size ",inFile.size)
xDim = inFile.size[0]
yDim = inFile.size[1]
newSize = aspectRatio(xDim, yDim)
inFile = inFile.resize((int(newSize[0]),int(newSize[1])),Image.ANTIALIAS)
inFile.save(outFile)
print ("New Size ",inFile.size, "\n")
return None
def aspectRatio(xDim, yDim):
Ratio = float(xDim/yDim)
xDelta = 830 - xDim
yDelta = 1000 - yDim
Oddball = [.99, .98, .97, .96, .95, .94, .93, .92, .91, .90, .89, .88, .87, .86, .85, .84, .83, .82, .81, .80]
New1 = [xDim+xDelta, yDim+xDelta*Ratio]
New2 = [xDim+yDelta*Ratio, yDim+yDelta]
if xDim == 830 and yDim == 1000:
print('No Change Needed')
return(xDim, yDim)
if xDim == yDim:
xDim = 830
yDim = 830
return(xDim, yDim)
else:
if New1[0] == 830 and New1[1] <= 1000:
xDim = float(New1[0])
yDim = float(New1[1])
return(xDim, yDim)
elif New1[0] <= 830 and New1[1] <= 1000:
xDim = float(New1[0])
yDim = float(New1[1])
return(xDim, yDim)
elif New2[0] <= 830 and New2[1] ==1000:
xDim = float(New2[0])
yDim = float(New2[1])
return(xDim, yDim)
elif .83 < Ratio < 1:
i = 0
while xDim >= 830 and yDim >= 1000:
xDim = float(New2[0] * Oddball[i])
yDim = float(New2[1] * Oddball[i])
i =+ 1
return(xDim,yDim)
else:
print('Manual Change Required')
return(xDim, yDim)
Следующие размеры изображений дают мне проблемы прямо сейчас.
Оригинальный размер (220, 643) Новый размер (830, 851)
Оригинальный размер (440, 617) Новый размер (830, 895)
Оригинальный размер (597, 480) Новый размер (830, 769)
Оригинальный размер (308, 631) Новый размер (830, 885))
Оригинальный размер (450, 625) Новый размер (830, 898)
Оригинальный размер (398, 631) Новый размер (830, 903)
Оригинальный размер (220, 643) Новый размер (830, 851)
Оригинальный размер (240, 643) Новый размер (830, 863)