0

Я пытаюсь масштабировать все изображения в папке до 90% от их соответствующих размеров. Написал это:Уменьшение изображений PNG увеличивает размер изображения

from PIL import Image 
import sys, csv, os, traceback 

path = "C:\Users\Dell\Desktop\Textures\\" 
dirs = os.listdir(path) 
scalingFactor = .9 

def resize(): 
for item in dirs: 
    print 'item', path+item 
    if os.path.isfile(path+item): 
     im = Image.open(path+item) 
     f, e = os.path.splitext(path+item) 
     imResize = im.resize((int(im.size[0]*scalingFactor),int(im.size[1]*scalingFactor)), Image.ANTIALIAS) 
     fileName = f.split('\\')[-1] 
     imResize.save(path + "/Out/" + fileName + ' resized_' + str(scalingFactor) + ".png" , 'PNG') 

Однако, когда я запускаю его, размер изображения фактически увеличивается вместо уменьшения (как я ожидал).

например. Исходное изображение 885x1130 466KB

enter image description here

Вывод изображения 796x1017 1,44 MB!

enter image description here

Я был довольно похож не-интуитивный опыт ранее с PNG-, вращая их и получил explanation about it here on Stackoverflow. Но я не могу убедить себя, что это, пожалуй, одна и та же проблема.

Любые подсказки? и что-то еще, что я могу сделать, чтобы уменьшить размер PNG? В порядке с небольшой потерей качества, если это необходимо.

+1

Вы масштабирование этих изображений вниз, потому что вы хотите меньший размер пикселя? Или вы делаете это, пытаясь уменьшить размер байтов файлов? –

+3

Обратите внимание, что масштабирование с помощью сглаживания может создавать _lot_ промежуточных цветов, которых нет в оригинале, и которые могут изменять сжимаемость изображения. PNG имеет множество параметров сжатия, но несколько программ дают вам доступ к параметрам, которые позволяют вам «настраивать» сжатие, а выбор лучших параметров - сложная задача. Существует несколько программ повторного сжатия PNG; Я использую и рекомендую [OptiPNG] (http://optipng.sourceforge.net). –

+0

@ PM2Ring Я хочу меньший размер файла. И да, я использую OptiPNG в качестве части пост-обработки, но это не уменьшало размер до нужной мне точки. Поэтому я подумал о его масштабировании и ожидал сокращения размера файла. –

ответ

1

Вы использовали фильтр Image.ANTIALIAS, который является высококачественным фильтром понижающей дискретизации.

Чтобы уменьшить размер изображения, вы можете использовать optimize=True и quality=90, сохраняя при этом изображение. Как -

imResize.save(path + "/Out/" + fileName + ' resized_' + str(scalingFactor) + ".png" ,optimize=True,quality=90) 

Оптимизировать флаг будет делать дополнительный проход на изображение, чтобы найти способ, чтобы уменьшить его размер как можно больше.

Теперь, чтобы уменьшить размер, вы можете изменить значение качества в параметрах сохранения.

Я предпочитаю качество 85 с optimize, потому что качество не сильно влияет, а размер файла намного меньше.

Надеюсь, это поможет!


Просто, чтобы добавить к вашему ответу, все фильтры, перечисленным здесь, чтобы принять решение о качестве против скорости исполнения и т.д.

http://pillow.readthedocs.io/en/3.4.x/handbook/concepts.html#concept-filters

+0

Спасибо @amit. Большая помощь !! – Tanu