Скрипт изменения размера изображения PIL - некоторые размеры изображения не будут масштабироваться должным образом - PullRequest
0 голосов
/ 25 января 2019

Для работы мне нужно изменить размеры сотен изображений, чтобы они соответствовали холсту 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)

1 Ответ

0 голосов
/ 25 января 2019

ИМО, есть более простой способ реализовать aspectRatio ()

fixed_ratio = 1000 / 830.0

def aspectRatio():
    curr_ratio = yDim *1.0 / xDim
    if curr_ratio <= fixed_ratio:
        return (830, 830 * curr_ratio)
    else:
        return (1000 / curr_ratio, 1000)

Это исправило вашу проблему.

...