異なる品質設定で画像を「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を実行していますが、それは助けになります。
コードに「品質」の誤植がある – ch7kor