문제

Python을 사용하여 PIL을 사용하여 다양한 각도로 텍스트를 그릴 수 있기를 원합니다.

예를 들어, 시계 앞면에 숫자를 그리고 있다고 상상해 보세요.수 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)

두 이미지를 함께 연결하는 나머지 부분은 이미이 페이지에 설명되어 있습니다. "규제되지 않은"각도로 회전하면이 코드를 약간 개선해야합니다. 실제로 90, 180, 270에 대해 작동합니다 ...

이것이 쉬울 것이다거나 이 솔루션이 반드시 완벽할 것이라고 말하는 것은 아니지만 여기 문서를 살펴보십시오.

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

특히 Image, 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()

실제로 원하는 것을 수행하려면 올바르게 회전된 별도의 텍스트 이미지를 만든 다음 좀 더 멋진 조작을 통해 모두 함께 구성해야 할 수도 있습니다.그리고 결국 그것은 여전히 ​​좋아 보이지 않을 수도 있습니다.예를 들어 안티앨리어싱 등이 어떻게 처리되는지 잘 모르겠지만 좋지 않을 수도 있습니다.행운을 빌어요. 누구든지 더 쉬운 방법이 있다면 저도 알고 싶습니다.

다음은 답변에서 영감을 얻은 작업 버전입니다. 그러나 이미지를 열거 나 저장하지 않고 작동합니다.

두 이미지에는 배경과 알파 채널이 0과 다른 일이 진행되는 일을 보여줍니다. 두 개의 알파 채널을 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