Frage

Python Ich möchte in der Lage sein, Text in verschiedenen Winkeln zu zeichnen PIL verwendet wird.

Zum Beispiel: Sie zeichnen die Zahl um das Gesicht einer Uhr. Die Zahl 3 erscheint wie erwartet, während 12 würden wir gegen den Uhrzeigersinn gedreht um 90 Grad gezogen.

Daher muss ich viele verschiedene Saiten bei vielen verschiedenen Winkeln zeichnen können.

War es hilfreich?

Lösung

Text in ein temporäres leeres Bild zeichnen, drehen, dass dann die Paste auf das Originalbild. Sie könnten die Schritte in einer Funktion einpacken. Viel Glück die genauen Koordinaten herauszufinden, zu verwenden - mein kalt verschleierten Gehirn ist nicht auf dem es jetzt.

Diese Demo schreibt gelben Text auf einer Schräge auf ein Bild um:

# 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)

Andere Tipps

Es ist usefull auch unser Text Größe in Pixel wissen, bevor wir ein Image-Objekt erstellen. Früher habe ich einen solchen Code, wenn Graphen zeichnen. Dann habe ich keine Probleme, zum Beispiel mit Ausrichtung von Datenbeschriftungen (ist das Bild genau so groß wie der Text).

(...)
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)

Der Rest der beiden Bilder zusammen Beitritt bereits auf dieser Seite beschrieben. Wenn Sie von einem „unregular“ Winkel drehen, haben Sie diesen Code ein wenig zu verbessern. Es funktioniert tatsächlich für 90, 180, 270 ...

Ich sage nicht so einfach sein wird, oder dass diese Lösung wird zwangsläufig für Sie perfekt sein, aber in der Dokumentation hier:

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

und besonders achten Sie auf das Bild, ImageDraw und ImageFont Module.

Hier ist ein Beispiel um Ihnen zu helfen:


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

tun, was Sie wirklich wollen, müssen Sie möglicherweise eine Reihe von separaten richtig gedreht Textbilder machen und komponieren sie dann alle zusammen mit etwas mehr Phantasie Manipulation. Und nach allem, kann es immer noch nicht gut aussehen. Ich bin mir nicht sicher, wie Anti-Aliasing und so wird zum Beispiel behandelt, aber es könnte nicht gut sein. Viel Glück, und wenn jemand einen einfacheren Weg hat, ich würde mich interessieren, wie gut kennen.

Hier ist eine Arbeitsversion, von der Antwort inspiriert, aber es funktioniert ohne Öffnen oder Speichern von Bildern.

Die beiden Bilder haben unterschiedliche Hintergründe und Alpha-Kanal gefärbt von Null zu zeigen, was los ist. Ändern der beiden Alpha-Kanäle 92-0 wird sie vollständig transparent machen.

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top