Более низкое качество изображения после вставки двух файлов - PullRequest
1 голос
/ 27 марта 2012

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

Код:

# open the profile pic
im = PIL.Image.open(pic)
# resize it to dim of oblique box
im = im.resize((picX, picY))

# this is the degree of oblique box
degree = 13.67

# open the background
bg = PIL.Image.open(bgsrc)
bgosize = bg.size
bginfo = bg.info


# first, I rotate the background to be paralell with profile pic
bg = bg.rotate(-degree, resample = PIL.Image.BILINEAR, expand = True)

# paste the profile pic to background
bg.paste(im, (px1, py1, px2, py2))

# rotate back to original orientation
bg = bg.rotate(degree, resample = PIL.Image.BILINEAR, expand = False)


# crop the rotated image, because it's greater than original size,
# after first rotate - coords are stored
bg.crop(bgx1, bgy1, bgx2, bgy2)

PIL.ImageFile.MAXBLOCK = bg.size[0] * bg.size[1]
bg.save(dst, quality = 250, optimize = True, **bginfo)

После этой трансформации результирующее изображение будет заметно маленьким ...

Как мне получить хорошее качественное изображение?

Спасибо:

а.

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Подсказка 1: используйте Image.BICUBIC вместо Image.BILINEAR.К сожалению, rotate не принимает Image.ANTIALIAS, что обеспечит еще лучший результат.

Подсказка 2: вместо поворота фона и его поворота позже, поверните изображение, которое вы хотите вставить.

Совет 3: создайте изображение в формате 'L', которое будет чисто белым и того же размера, что и вставляемое изображение.Поверните его так же.Используйте его в качестве аргумента маски для paste.


Я не проверял этот код, но он должен работать.Один вопрос, однако, что quality = 250 должен достичь?Например, параметры JPEG принимают значения только от 1 до 95.
# open the profile pic 
im = PIL.Image.open(pic) 
# resize it to dim of oblique box 
im = im.resize((picX, picY), PIL.Image.ANTIALIAS) 

# this is the degree of oblique box 
degree = 13.67 

# open the background 
bg = PIL.Image.open(bgsrc) 
bgosize = bg.size 
bginfo = bg.info 

# create a copy of the profile that is all white
mask = PIL.Image.new('L', im.size, 0xff)

# rotate the profile and the mask
im = im.rotate(degree, resample = PIL.Image.BICUBIC, expand = True)
mask = mask.rotate(degree, resample = PIL.Image.BICUBIC, expand = True)

# paste the profile pic to background 
bg.paste(im, (px1, py1, px2, py2), mask) 

PIL.ImageFile.MAXBLOCK = bg.size[0] * bg.size[1] 
bg.save(dst, quality = 250, optimize = True, **bginfo) 
1 голос
/ 27 марта 2012

Попробуйте бикубическую интерполяцию? Если это не помогает, попробуйте увеличить изображение (скажем, в 2 или даже 4 раза), повернуть, а затем уменьшить его до исходных размеров.

...