【问题标题】:PIL Image Resizing Script - Some image sizes won't scale properlyPIL Image Resizing Script - 某些图像大小无法正确缩放
【发布时间】:2019-01-26 03:35:18
【问题描述】:

为了工作,我必须调整数百张图像的大小以适应 830x1000 像素的画布,同时保持纵横比(因此图像不会被拉伸和扭曲)。我使用 PIL 编写了一个 python 脚本。这适用于大多数图像,但运行脚本后有些图像大小会失真。

我知道问题出在案例陈述中,但我不确定问题出在哪里。

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)

【问题讨论】:

    标签: python python-imaging-library


    【解决方案1】:

    IMO,有一种更简单的方法来实现 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)
    
    

    这解决了您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 2011-06-21
      • 2021-06-27
      • 1970-01-01
      • 2018-04-01
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多