2009-07-02 2 views
1

Google 색인에있는 모든 이미지에 작은 thumbnail이 있는지 확인하십시오. 미리보기 이미지는 다음과 같습니다.<10KB이고 비율을 잃지 않는 이미지 미리보기 이미지 생성

  1. 크기가 10KB 미만입니다.
  2. 너비/높이의 비율은 원본 이미지의 비율과 같습니다.

이미지를 가져 와서 속성에 대한 미리보기 이미지를 만드는 기능 (파이썬에서)을 작성하고 싶습니다.

편집 : 지금은 3 가지 답변이 있으며 모두 반액입니다.

이미지를 비례하여 크기를 조정할뿐만 아니라 파일 크기가 10KB보다 작은 지 확인하는 기능이 필요합니다. 어떻게해야합니까?

+0

중복 : http://stackoverflow.com/questions/273946/how-do-i-resize-an-image-using-pil-and-maintain-its-aspect-ratio –

+0

이것은 중복이 아닙니다! "EDIT"에서 지금 말했듯이, 비례 적으로 이미지의 크기를 조정할뿐만 아니라 크기가 10KB보다 작은 지 확인해야하는 기능이 필요합니다. – quilby

답변

3

this short post에서 Mike Fletcher와 effbot은 여러분이하고 싶은 작업에 대한 훌륭한 접근 방식을 보여줍니다.

편집 :: 10K 요구 사항은 이미지의 형식에 따라 이미지가 얼마나 잘 압축 될지 예측하기 어렵습니다. 압축 알고리즘이 너무 미세하기 때문에 어렵습니다. 섬네일 크기가 < 10K 요구 사항을 준수하면서 가능한 한 큰 픽셀 (픽셀 단위)로 표시되도록하려면 '시행 착오'방식을 사용하여 크기 조정 계수에 대해보다 세련된 추측을해야 할 수도 있습니다. 수용 가능한 결과.

예를 들어, 여기 ... 무슨 일이 일어나고 있는지 설명하기 위해 충분한 print 문으로 (! ​​아니라 더 나은 전략이있을 수 있습니다) & C를 정확한 크기를 얻기에 "이진 검색"접근 방식 :

import Image 
import cStringIO 
import math 
import os 
import stat 

# try no more than 10 times, then give up 
MAX_TRIES = 10 

def getThumbnail(filename, max_bytes=(10*1024)): 
    '''Get a thumbnail image of filename, <max_bytes''' 
    original_size = os.stat(filename)[stat.ST_SIZE] 
    print "Original file size: %.1f KB" % (original_size/1024.) 
    image = Image.open(filename) 
    image.load() 
    print "Original image size: %dx%d pixels" % image.size 
    min_bytes = int(0.9 * max_bytes) 
    largest_side = max(image.size) 
    smallest_side = 16 
    for attempt in range(MAX_TRIES): 
     try_side = (largest_side + smallest_side)/2 
    print "Attempt #%d of %d" % (attempt+1, MAX_TRIES) 
    print "Side must be within [%d:%d], now trying %d" % (
     smallest_side, largest_side, try_side) 
    thumb = image.copy() 
    thumb.thumbnail((try_side,try_side), Image.ANTIALIAS) 
    afile = cStringIO.StringIO() 
    thumb.save(afile, "PNG") 
    resulting_size = len(afile.getvalue()) 
    afile.close() 
    print "Reduced file size: %.1f KB" % (resulting_size/1024.) 
    print "Reduced image size: %dx%d pixels" % thumb.size 
    if min_bytes <= resulting_size <= max_bytes: 
     print "Success!" 
     return thumb 
    elif resulting_size > max_bytes: 
     print "Too large (>%d), reducing more" % max_bytes 
     largest_side = try_side 
    else: 
     print "Too small (<%d), reducing less" % min_bytes 
     smallest_side = try_side 
    print "too many attempts, returning what I've got!" 
    return thumb 

def main(): 
    thumb = getThumbnail("pyth.png") 
    print "Reduced image size: %dx%d pixels" % thumb.size 
    print "Saving to thumb.png" 
    thumb.save("thumb.png") 
    thumb_size = os.stat("thumb.png")[stat.ST_SIZE] 
    print "Reduced file size: %.1f KB" % (thumb_size/1024.) 
    print "Done, bye!" 

if __name__ == '__main__': 
    main() 
1

사용 PIL, 화면 비율

How do I resize an image using PIL and maintain its aspect ratio?

이 디렉토리에 유사한 일을하는 방법을 살펴 유지 크기를 조정하려면 여기를 샘플 코드를 참조

Resize images in directory

위의 링크는 PIL을 사용하여 이미지의 크기를 조정하는 방법을 설명합니다. 최대 크기는 10KB이며 쉽게 달성 할 수 있습니다. 필요한

한다고 가정 크기가 100 × 100이고, 우리는 JPEG 압축, 100 % JPEG 품질은 픽셀 당 9 비트 (http://en.wikipedia.org/wiki/JPEG 참조) 있습니다 ABT 얻어 사용, 즉 100 × 100 화상의 크기가 화질 있도록 100x100x9/(1024x8) = 11킬로바이트 것 수단 = 100 거의 목표를 달성하고 있지만 여전히 10KB 만 원할 경우 품질 = 90으로 설정할 수 있으며 일반적으로 크기를 매개 변수로 전달하여 크기를 조정하고 이미지 크기가 10KB를 넘으면 품질을 10 % 낮출 수 있지만 생각합니다. 90 % 품질로 모든 JPEG 이미지는 < 10KB가됩니다.

또한 압축하지 않으면 RGB 이미지의 경우 이미지 크기가 30KB 밖에되지 않으며 크기를 60x60 픽셀로 축소하면 이미지 크기가 압축없이 10KB가됩니다. 즉, bmp 이미지를 사용할 수 있으며, 압축 당신은 PNG를 선택할 수 있습니다.

결론적으로 10KB의 목표는 매우 쉽게 달성 할 수 있습니다.

관련 문제