복붙노트

[PYTHON] 가로 세로 비율을 유지하면서 크기를 조정하고 세로 및 가로 이미지를 정확히 동일한 크기로 만드시겠습니까?

PYTHON

가로 세로 비율을 유지하면서 크기를 조정하고 세로 및 가로 이미지를 정확히 동일한 크기로 만드시겠습니까?

현재 나는 다음을 사용하고있다 :

    os.chdir(album.path)
    images = glob.glob('*.*')

    # thumbs size
    size = 80,80

    for image in images:
        #create thumb
        file, ext = os.path.splitext(image)
        im = Image.open(os.path.join(album.path,image))
        im.thumbnail(size, Image.ANTIALIAS)
        thumb_path = os.path.join(album.path, 'thumbs', file + ".thumb" + ".jpeg")
        im.save(thumb_path)

이 방법이 효과가 있지만 다양한 크기의 이미지 (일부는 세로, 일부는 가로)로 끝나지 만 모든 이미지가 정확한 크기를 갖기를 바랍니다. 아마도 합리적인 수확일까요?

최신 정보:

나는 이미지의 작은 부분을 자르기해도 상관 없다. 내가 합리적인 수확을 말했을 때 나는 이와 같은 것을 의미했다. algorythm :

if image is portrait:
    make width 80px
    crop the height (will be more than 80px)
else if image is landscape:
    make height 80px
    crop the width to 80px (will be more than 80px)

해결법

  1. ==============================

    1.다음은 이미지에 패딩 처리를하는 방법입니다.

    다음은 이미지에 패딩 처리를하는 방법입니다.

    #!/usr/bin/env python
    
    from PIL import Image, ImageChops
    
    F_IN = "/path/to/image_in.jpg"
    F_OUT = "/path/to/image_out.jpg"
    
    size = (80,80)
    
    image = Image.open(F_IN)
    image.thumbnail(size, Image.ANTIALIAS)
    image_size = image.size
    
    thumb = image.crop( (0, 0, size[0], size[1]) )
    
    offset_x = max( (size[0] - image_size[0]) / 2, 0 )
    offset_y = max( (size[1] - image_size[1]) / 2, 0 )
    
    thumb = ImageChops.offset(thumb, offset_x, offset_y)
    thumb.save(F_OUT)
    

    먼저 축소판 작업을 사용하여 이미지를 원래 범위 내로 가져오고 측면을 유지합니다. 그런 다음 원래 크기가 정사각형이 아니면 크기가 작아지기 때문에 범위의 크기를 실제로 채우기 위해 다시 잘라냅니다. 그리고 이미지를 가운데에 맞출 적절한 오프셋을 찾습니다. 이미지가 중앙으로 오프셋되어 검은 색 패딩으로 끝나지만 이미지 자르기는 종료됩니다.

    가장자리에서 가능한 중요한 이미지 데이터를 잃지 않고 적절한 중심 작물을 실제로 감각적으로 추측 할 수 없다면 패딩 된 맞춤 방식이 더 잘 작동합니다.

    최신 정보

    센터 자르기 또는 패드 맞추기를 수행 할 수있는 버전이 있습니다.

    #!/usr/bin/env python
    
    from PIL import Image, ImageChops, ImageOps
    
    def makeThumb(f_in, f_out, size=(80,80), pad=False):
    
        image = Image.open(f_in)
        image.thumbnail(size, Image.ANTIALIAS)
        image_size = image.size
    
        if pad:
            thumb = image.crop( (0, 0, size[0], size[1]) )
    
            offset_x = max( (size[0] - image_size[0]) / 2, 0 )
            offset_y = max( (size[1] - image_size[1]) / 2, 0 )
    
            thumb = ImageChops.offset(thumb, offset_x, offset_y)
    
        else:
            thumb = ImageOps.fit(image, size, Image.ANTIALIAS, (0.5, 0.5))
    
        thumb.save(f_out)
    
    
    source = "/path/to/source/image.JPG"
    
    makeThumb(source, "/path/to/source/image_padded.JPG", pad=True)
    makeThumb(source, "/path/to/source/image_centerCropped.JPG", pad=False)
    
  2. ==============================

    2.분명히 이미지를 잘라내거나 채울 필요가 있습니다. 엄지 손톱의 가로 세로 비율 (테스트되지 않음)에 따라 최대 가운데 맞춤 작물을 얻으려면 다음과 같이 할 수 있습니다.

    분명히 이미지를 잘라내거나 채울 필요가 있습니다. 엄지 손톱의 가로 세로 비율 (테스트되지 않음)에 따라 최대 가운데 맞춤 작물을 얻으려면 다음과 같이 할 수 있습니다.

    aspect = lambda size: float(size[0]) / float(size[1])
    sa = aspect(size)
    if aspect(im.size) > sa:
        width = int(sa * im.size[1])
        left = (im.size[0] - width) / 2
        im = im.crop((left, 0, left + width, im.size[1]))
    else:
        height = int(im.size[0] / sa)
        top = (im.size[1] - height) / 2
        im = im.crop((0, top, im.size[0], top + height))
    im.thumbnail(size, Image.ANTIALIAS)
    
  3. ==============================

    3.쉬운 미리보기 이미지를 사용하는 경우 자르기를 True로 설정하고 높이를 True로 설정하여 항상 공간을 채울 수 있어야합니다 (정확히 동일한 치수).

    쉬운 미리보기 이미지를 사용하는 경우 자르기를 True로 설정하고 높이를 True로 설정하여 항상 공간을 채울 수 있어야합니다 (정확히 동일한 치수).

    예 : image_1 크기에 맞게 image_2를 만듭니다.

        thumbnailer = get_thumbnailer(image_2)
        thumbnail = thumbnailer.generate_thumbnail(thumbnail_options={
            'crop': True,
            'upscale': True,
            'size': image_1.size
        })
        image_2 = thumbnail.image
    
  4. from https://stackoverflow.com/questions/9103257/resize-image-maintaining-aspect-ratio-and-making-portrait-and-landscape-images-e by cc-by-sa and MIT license