Укажите цвет заполнения изображения при повороте в python с помощью PIL и установите для параметра expand значение true
Я пытаюсь повернуть изображение в Python с помощью PIL и иметь аргумент expand для true. Похоже, что когда фон моего изображения черный, результирующее изображение, сохраненное как BMP, будет намного меньше, чем если бы у меня был белый фон для моего изображения, а затем я заменяю черный, потому что он расширяется с белым. В любом случае мое исходное изображение всегда имеет два цвета, и сейчас мне нужно, чтобы размер файла был небольшим, так как я помещаю эти изображения на встроенное устройство.
Любые идеи, если я могу заставить rotate заполнить другой цвет при расширении или если есть другой способ повернуть изображение, чтобы сделать его маленьким?
Ответы
Ответ 1
Если ваше исходное изображение не имеет альфа-слоя, вы можете использовать альфа-слой в качестве маски для преобразования фона в белый. Когда rotate
создает "фон", он делает его полностью прозрачным.
# original image
img = Image.open('test.png')
# converted to have an alpha layer
im2 = img.convert('RGBA')
# rotated image
rot = im2.rotate(22.2, expand=1)
# a white image same size as rotated image
fff = Image.new('RGBA', rot.size, (255,)*4)
# create a composite image using the alpha layer of rot as a mask
out = Image.composite(rot, fff, rot)
# save your work (converting back to mode='1' or whatever..)
out.convert(img.mode).save('test2.bmp')
Ответ 2
Вот рабочая версия, вдохновленная ответом, но она работает без открытия или сохранения изображений и показывает, как поворачивать текст.
Два изображения имеют цветной фон и альфа-канал, отличный от нуля, чтобы показать, что происходит. Изменение двух альфа-каналов от 92 до 0 сделает их полностью прозрачными.
from PIL import Image, ImageFont, ImageDraw
text = 'TEST'
font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', 50)
width, height = font.getsize(text)
image1 = Image.new('RGBA', (200, 150), (0, 128, 0, 92))
draw1 = ImageDraw.Draw(image1)
draw1.text((0, 0), text=text, font=font, fill=(255, 128, 0))
image2 = Image.new('RGBA', (width, height), (0, 0, 128, 92))
draw2 = ImageDraw.Draw(image2)
draw2.text((0, 0), text=text, font=font, fill=(0, 255, 128))
image2 = image2.rotate(30, expand=1)
px, py = 10, 10
sx, sy = image2.size
image1.paste(image2, (px, py, px + sx, py + sy), image2)
image1.show()