2017-12-12 18 views
0

다른 품질 설정으로 이미지를 'JPEG'로 저장 한 다음 다시로드하고 양자화 행렬을 읽으려고합니다. 이들 행렬은 각 품질 매개 변수에 대해 달라야합니다.PIL.save()가 다른 품질의 이미지를 저장하지 않음

다음 코드는 그렇게해야합니다

from PIL import Image 

im_path = '~/Pictures/Origianl.JPG' # path to original image 
im_path_tmp = '~/Pictures/DifferentQuality_' # trunk of path to images of lower quality 

im = Image.open(im_path) # load original image 

qs = {} # empty dictionary to save quantization matrices 
qs['orig'] = im.quantization[0] # also remember q-matrix of original image 

for i, qual in enumerate(range(100,-1,-10)): # run over 10 different quality parameters 
    curr_path = im_path_tmp + str(qual) + '.JPG' # each image gets its own path 
    print('iteration: {:2d}, curr_quality={:03d},curr_path={}'.format(i,qual,curr_path)) 
    im.save(curr_path, 'JPEG', qualilty=qual) # save image: quality-parameter is set! 
    tmp = Image.open(curr_path) # load image again 
    qs[qual] = tmp.quantization[0] # read out q-matrix and save to dict 
    del tmp 
    del curr_path 

print() 

for key, value in qs.items(): # show all q-matrices 
    print('{}:\n\t{}'.format(key,value[0:32])) 

지금은 10 개의 Q 행렬을 기대합니다. 그들은 모두 동일하지만 :

orig: 
    array('B', [2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 5, 3, 3, 3, 5, 6, 5, 5, 5, 5, 6, 8, 6, 6, 6, 6, 6, 8, 10, 8, 8, 8]) 
100: 
    array('B', [8, 6, 6, 7, 6, 5, 8, 7, 7, 7, 9, 9, 8, 10, 12, 20, 13, 12, 11, 11, 12, 25, 18, 19, 15, 20, 29, 26, 31, 30, 29, 26]) 
90: 
    array('B', [8, 6, 6, 7, 6, 5, 8, 7, 7, 7, 9, 9, 8, 10, 12, 20, 13, 12, 11, 11, 12, 25, 18, 19, 15, 20, 29, 26, 31, 30, 29, 26]) 
80: 
    array('B', [8, 6, 6, 7, 6, 5, 8, 7, 7, 7, 9, 9, 8, 10, 12, 20, 13, 12, 11, 11, 12, 25, 18, 19, 15, 20, 29, 26, 31, 30, 29, 26]) 
70: 
    array('B', [8, 6, 6, 7, 6, 5, 8, 7, 7, 7, 9, 9, 8, 10, 12, 20, 13, 12, 11, 11, 12, 25, 18, 19, 15, 20, 29, 26, 31, 30, 29, 26]) 
60: 
    array('B', [8, 6, 6, 7, 6, 5, 8, 7, 7, 7, 9, 9, 8, 10, 12, 20, 13, 12, 11, 11, 12, 25, 18, 19, 15, 20, 29, 26, 31, 30, 29, 26]) 

# and so on ... 

참고 그것은 모든 다른 사람에게는 오리지널에서 변경할된다. 내가 파이썬 인터프리터처럼 수동으로 저장하면, 그것은 어떤 이상한 이유로, 작동 : 수동으로 수행하는 경우

In [90]: im.save('~/Pictures/manual.JPG', 'JPEG', quality=70) 
In [91]: tmp = Image.open('~/Pictures/manual.JPG') 
In [92]: tmp.quantization[0] 

Out[92]: array('B', [10, 7, 7, 8, 7, 6, 10, 8, 8, 8, 11, 10, 10, 11, 14, 24, 16, 14, 13, 13, 14, 29, 21, 22, 17, 24, 35, 31, 37, 36, 34, 31, 34, 33, 38, 43, 55, 47, 38, 41, 52, 41, 33, 34, 48, 65, 49, 52, 57, 59, 62, 62, 62, 37, 46, 68, 73, 67, 60, 72, 55, 61, 62, 59]) 

이유는, 동작 다르다. 내 생각에 인터프리터가 someting을 최적화했습니다. 그렇다면 어떻게 전환 할 수 있습니까? 나는 Anaconda python 3.6.1로 ipython을 인터프리터로 돌리고 있는데, 그것은 도움이된다.

+0

코드에 "품질"이 오타가 있습니다. – ch7kor

답변

0

세이브 기능의 서명에 오타가 있다고 지적한 @ ch7kor에게 감사드립니다. 나는 "품질"대신 "qual IL"을 전달합니다.

그건 내 실제 질문을 해결합니다.

다음 질문을 제기합니다. 오류가 발생하지 않는 이유는 무엇입니까? 이 매개 변수 (오타 포함)가 함수의 서명에 존재하는 것 같지 않습니다.