كيف يمكنني رسم النص في زاوية باستخدام بايثون PIL ؟

StackOverflow https://stackoverflow.com/questions/245447

سؤال

باستخدام بيثون كنت تريد أن تكون قادرة على رسم النص في زوايا مختلفة باستخدام بيل.

على سبيل المثال, تخيل أنك الرسم عدد حول وجه الساعة.عدد 3 سوف تظهر كما هو متوقع في حين 12 يمكننا رسم استدارة في اتجاه عقارب الساعة 90 درجة.

لذلك أنا بحاجة إلى أن تكون قادرة على رسم العديد من سلاسل مختلفة في العديد من زوايا مختلفة.

هل كانت مفيدة؟

المحلول

رسم النص إلى مؤقت صورة فارغة ، تدوير ، ثم لصق على الصورة الأصلية.هل يمكن أن يختتم الخطوات في وظيفة.بالتوفيق معرفة الإحداثيات الدقيقة إلى استخدام بلدي الباردة-رش الدماغ لا يصل إلى ذلك الآن.

هذا العرض الأصفر يكتب النص على الميل أكثر من صورة:

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

نصائح أخرى

كما انها مفيدة لمعرفة النص الحجم بالبكسل قبل خلق صورة كائن.أنا استخدم هذا الرمز عند رسم الرسوم البيانية.ثم حصلت أي مشاكل مثلامع محاذاة تسميات البيانات (الصورة هو بالضبط كبيرة مثل النص).

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

بقية الانضمام إلى الصورتين معا بالفعل الموضحة في هذه الصفحة.عند تدوير من قبل "unregular" زاوية لديك لتحسين هذا الكود قليلا.فإنه في الواقع يعمل لمدة 90, 180, 270...

أنا لا أقول أن هذا سيكون سهلا أو أن هذا الحل سيكون بالضرورة مثالية بالنسبة لك, ولكن انظر الوثائق هنا:

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

وخاصة الاهتمام إلى الصورة ، ImageDraw ، ImageFont وحدات.

هنا مثال لمساعدتك:


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

أن تفعل ما تريد حقا قد تحتاج إلى إجراء مجموعة منفصلة بشكل صحيح استدارة النص الصور ثم يؤلف كل منهم جنبا إلى جنب مع بعض أكثر الهوى التلاعب.و بعد كل هذا فإنه لا يزال قد لا تبدو كبيرة.لست متأكدا كيف الحواف و هذا هو التعامل معها على سبيل المثال, ولكن قد لا تكون جيدة.حظا سعيدا, وإذا كان أي شخص لديه طريقة أسهل, سأكون مهتما لمعرفة كذلك.

هنا هو نسخة تعمل مستوحاة من الجواب ، ولكنه يعمل دون فتح أو حفظ الصور.

اثنين من الصور الملونة خلفية قناة ألفا مختلفة من صفر إلى إظهار ما يجري.تغيير اثنين من قنوات ألفا من 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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top