Pergunta

Usando Python Eu quero ser capaz de desenhar texto em ângulos diferentes usando PIL.

Por exemplo, imagine que você estava desenhando o número em todo o mostrador de um relógio. O número 3 iria aparecer como esperado enquanto 12 que nós desenhado giradas sentido anti-horário 90 graus.

Por isso, eu preciso ser capaz de desenhar muitas cordas diferentes em muitos ângulos diferentes.

Foi útil?

Solução

Desenhar texto em uma imagem em branco temporária, girar que, em seguida, cole que para a imagem original. Você poderia encerrar as etapas em uma função. Boa sorte para descobrir as coordenadas exatas para uso - meu cérebro embaçada-frio não é até agora.

Esta demonstração escreve texto amarelo em um plano inclinado sobre uma imagem:

# Demo to add rotated text to an image using PIL

import Image
import ImageFont, ImageDraw, ImageOps

im=Image.open("stormy100.jpg")

f = ImageFont.load_default()
txt=Image.new('L', (500,50))
d = ImageDraw.Draw(txt)
d.text( (0, 0), "Someplace Near Boulder",  font=f, fill=255)
w=txt.rotate(17.5,  expand=1)

im.paste( ImageOps.colorize(w, (0,0,0), (255,255,84)), (242,60),  w)

Outras dicas

Também é útil saber o tamanho do nosso texto em pixels, antes de criar um objeto de imagem. Eu usei esse código ao desenhar gráficos. Então eu não tenho problemas por exemplo com o alinhamento dos rótulos de dados (a imagem é exatamente tão grande quanto o texto).

(...)
img_main = Image.new("RGB", (200, 200))
font = ImageFont.load_default()

# Text to be rotated...
rotate_text = u'This text should be rotated.'

# Image for text to be rotated
img_txt = Image.new('L', font.getsize(rotate_text))
draw_txt = ImageDraw.Draw(img_txt)
draw_txt.text((0,0), rotate_text, font=font, fill=255)
t = img_value_axis.rotate(90, expand=1)

O resto de unir as duas imagens juntas já é descrito nesta página. Quando você gira por um ângulo "unregular", você tem que melhorar este código um pouco. Ele realmente funciona para 90, 180, 270 ...

Eu não estou dizendo que isso vai ser fácil, ou que esta solução será necessariamente perfeito para você, mas olhada na documentação aqui:

http://effbot.org/imagingbook/pil-index.htm

e, especialmente, prestar atenção à imagem, módulos ImageDraw e ImageFont.

Aqui está um exemplo para ajudá-lo:


import Image
im = Image.new("RGB", (100, 100))
import ImageDraw
draw = ImageDraw.Draw(im)
draw.text((50, 50), "hey")
im.rotate(45).show()

Para fazer o que você realmente quer que você pode precisar fazer um monte de imagens separadas de texto corretamente girado e, em seguida, compor-los todos juntos com um pouco mais de fantasia manipulação. E depois de tudo que ele ainda não pode olhar grande. Eu não tenho certeza de como antialiasing e tal é tratado por exemplo, mas pode não ser bom. Boa sorte, e se alguém tem uma maneira mais fácil, eu estaria interessado em saber também.

Aqui está uma versão de trabalho, inspirado pela resposta, mas funciona sem abrir ou salvar imagens.

As duas imagens têm um fundo colorido e alfa diferente canal de zero a mostrar o que está acontecendo. Alterando os dois canais alfa de 92-0 irá torná-los completamente transparente.

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top