2017-12-12 4 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-行列を期待しています。それらはすべて同じですけれども:それはすべての人にのorignalからに変更されていることを

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"の代わりに "qual IL"を渡します。

これは私の実際の質問を解決します。

また、次の質問が表示されます。なぜエラーがスローされないのですか。私は、このパラメータ(typo付き)が関数の署名に存在するのではないかと疑う。

関連する問題