объединить несколько png с одним прозрачным png, используя PIL

87
5

У меня много маленьких png, которые я хочу объединить в один файл png, я использую python для выполнения этой работы, это мой код:

from PIL import Image,ImageDraw  
import os,math

def combine_images(path,out,padding=1):
imgs=[]
min_width,max_width,min_height,max_height=-1,-1,-1,-1
for infile in os.listdir(path):
f,ext=os.path.splitext(infile)
if ext== ".png":
im=Image.open(os.path.join(path,infile))
imgs.append(im)
min_width = im.size[0] if min_width<0 else min(min_width,im.size[0])
max_width = im.size[0] if max_width<0 else max(max_width,im.size[0])
min_height = im.size[1] if min_height<0 else min(min_height,im.size[0])
max_height = im.size[1] if max_height<0 else max(max_height,im.size[0])
#calculate the column and rows
num = len(imgs)
column_f = math.ceil(math.sqrt(num))
row_f = math.ceil(num / column_f)

column = int(column_f)
row = int(row_f)

#out image
box=(max_width + padding*2,max_height + padding*2)
out_width = row * box[0]
out_height = column * box[1]

//out_image=Image.new('L', (out_width,out_height), color=transparent)
out_image=Image.new("RGB", (out_width, out_height))
for y in range(row):
for x in range(column):
index = (y * column) + x
if index < num:
out_image.paste(imgs[index],(x * box[0],y * box[1]))
out_image.save(out)

combine_images('icon','t.png')

Логика проста, читайте png в определенном каталоге, вычисляйте количество, размер изображений, затем создайте новое изображение и вставьте их по одному. Дополнительный расчет используется, чтобы сделать изображение результата максимально квадратным.

Однако это то, что я получил: http://pbrd.co/1kzErSc

Я встречаю две проблемы:

1 Я не могу сделать изображение прозрачным.

2 Кажется, что мой макет значков будет тратить слишком много места на изображении.

Интересно, можно ли это исправить?

спросил(а) 2014-06-05T06:29:00+04:00 6 лет, 2 месяца назад
1
Решение
55

out_image=Image.new("RGB", (out_width, out_height))

Вам нужно указать, что вам нужен альфа-канал при создании изображения

out_image=Image.new("RGBA", (out_width, out_height))

Что касается потраченного впустую пространства, на ум приходит две вещи:

Это имеет значение? Если вам нужен размер файла (а не размер изображения), проверьте, действительно ли изображение увеличилось в размере файла. Поскольку PNG является сжатым форматом, это может иметь значение.

Сортируйте изображения по высоте после их загрузки, группируйте их в похожие изображения по высоте и изменяйте размер сетки для каждой группы. Это может не сработать, если приложение, использующее изображения, должно угадать размер каждого значка.

ответил(а) 2014-06-05T06:34:00+04:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема