Hướng dẫn python pillow rotate text - trăn gối xoay văn bản

Sử dụng Python, tôi muốn có thể vẽ văn bản ở các góc khác nhau bằng PIL.

Ví dụ, hãy tưởng tượng bạn đang vẽ số xung quanh mặt đồng hồ. Số 3 sẽ xuất hiện như mong đợi trong khi 12 chúng tôi sẽ vẽ quay ngược chiều kim đồng hồ 90 độ.3 would appear as expected whereas 12 would we drawn rotated counter-clockwise 90 degrees.

Do đó, tôi cần có khả năng vẽ nhiều chuỗi khác nhau ở nhiều góc độ khác nhau.

Đã hỏi ngày 29 tháng 10 năm 2008 lúc 1:04Oct 29, 2008 at 1:04

Hướng dẫn python pillow rotate text - trăn gối xoay văn bản

Vẽ văn bản vào một hình ảnh trống tạm thời, xoay nó, sau đó dán nó vào hình ảnh gốc. Bạn có thể kết thúc các bước trong một chức năng. Chúc may mắn tìm ra tọa độ chính xác để sử dụng - bộ não bị lạnh của tôi không phụ thuộc vào nó ngay bây giờ.

Bản demo này viết văn bản màu vàng trên một hình ảnh trên một hình ảnh:

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

Đã trả lời ngày 29 tháng 10 năm 2008 lúc 5:31Oct 29, 2008 at 5:31

Hướng dẫn python pillow rotate text - trăn gối xoay văn bản

DarenwdarenwDarenW

16.3k7 Huy hiệu vàng63 Huy hiệu bạc100 Huy hiệu Đồng7 gold badges63 silver badges100 bronze badges

Thật hữu ích khi biết kích thước văn bản của chúng tôi trong pixel trước khi chúng tôi tạo một đối tượng hình ảnh. Tôi đã sử dụng mã đó khi vẽ đồ thị. Sau đó, tôi không gặp vấn đề gì, ví dụ: với sự liên kết của nhãn dữ liệu (hình ảnh chính xác bằng văn bản).

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

Phần còn lại của việc tham gia hai hình ảnh với nhau đã được mô tả trên trang này. Khi bạn xoay theo một góc "không thường xuyên", bạn phải cải thiện mã này một chút. Nó thực sự hoạt động trong 90, 180, 270 ...

Đã trả lời ngày 12 tháng 4 năm 2009 lúc 10:48Apr 12, 2009 at 10:48

Dưới đây là một phiên bản làm việc, lấy cảm hứng từ câu trả lời, nhưng nó hoạt động mà không cần mở hoặc lưu hình ảnh.

Hai hình ảnh có nền màu và kênh alpha khác với 0 để hiển thị những gì đang diễn ra. Thay đổi hai kênh alpha từ 92 thành 0 sẽ khiến chúng hoàn toàn minh bạch.

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

Đã trả lời ngày 23 tháng 2 năm 2016 lúc 19:44Feb 23, 2016 at 19:44

Hướng dẫn python pillow rotate text - trăn gối xoay văn bản

Stencistencistenci

7.81513 Huy hiệu vàng59 Huy hiệu bạc98 Huy hiệu Đồng13 gold badges59 silver badges98 bronze badges

0

Đây là một ví dụ đầy đủ hơn về hình mờ theo đường chéo. Xử lý tỷ lệ hình ảnh, kích thước và chiều dài văn bản tùy ý bằng cách tính góc của kích thước đường chéo và phông chữ.

from PIL import Image, ImageFont, ImageDraw
import math

# sample dimensions
pdf_width = 1000
pdf_height = 1500

#text_to_be_rotated = 'Harry Moreno'
text_to_be_rotated = 'Harry Moreno ()'
message_length = len(text_to_be_rotated)

# load font (tweak ratio based on your particular font)
FONT_RATIO = 1.5
DIAGONAL_PERCENTAGE = .5
diagonal_length = int(math.sqrt((pdf_width**2) + (pdf_height**2)))
diagonal_to_use = diagonal_length * DIAGONAL_PERCENTAGE
font_size = int(diagonal_to_use / (message_length / FONT_RATIO))
font = ImageFont.truetype(r'./venv/lib/python3.7/site-packages/reportlab/fonts/Vera.ttf', font_size)
#font = ImageFont.load_default() # fallback

# target
image = Image.new('RGBA', (pdf_width, pdf_height), (0, 128, 0, 92))

# watermark
opacity = int(256 * .5)
mark_width, mark_height = font.getsize(text_to_be_rotated)
watermark = Image.new('RGBA', (mark_width, mark_height), (0, 0, 0, 0))
draw = ImageDraw.Draw(watermark)
draw.text((0, 0), text=text_to_be_rotated, font=font, fill=(0, 0, 0, opacity))
angle = math.degrees(math.atan(pdf_height/pdf_width))
watermark = watermark.rotate(angle, expand=1)

# merge
wx, wy = watermark.size
px = int((pdf_width - wx)/2)
py = int((pdf_height - wy)/2)
image.paste(watermark, (px, py, px + wx, py + wy), watermark)

image.show()

Đây là trong một colab https://colab.research.google.com/drive/1erl7pix6xky5h9eemulbkpgglf6eucna?usp=shared Bạn nên cung cấp một hình ảnh ví dụ cho colab.

Hướng dẫn python pillow rotate text - trăn gối xoay văn bản
Hướng dẫn python pillow rotate text - trăn gối xoay văn bản

Đã trả lời ngày 21 tháng 7 năm 2020 lúc 0:55Jul 21, 2020 at 0:55

Hướng dẫn python pillow rotate text - trăn gối xoay văn bản

Harry Morenoharry MorenoHarry Moreno

9.2996 Huy hiệu vàng59 Huy hiệu bạc105 Huy hiệu Đồng6 gold badges59 silver badges105 bronze badges

1

Tôi không nói điều này sẽ dễ dàng, hoặc giải pháp này nhất thiết sẽ là hoàn hảo cho bạn, nhưng hãy nhìn vào tài liệu ở đây:

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

và đặc biệt chú ý đến các mô -đun hình ảnh, hình ảnh và ImageFont.

Đây là một ví dụ để giúp bạn:


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

Để làm những gì bạn thực sự muốn, bạn có thể cần phải tạo ra một loạt các hình ảnh văn bản được xoay riêng biệt và sau đó soạn tất cả chúng cùng với một số thao tác ưa thích hơn. Và sau tất cả những gì nó vẫn có thể trông không tuyệt vời. Tôi không chắc chắn làm thế nào antialiasing và như vậy được xử lý chẳng hạn, nhưng nó có thể không tốt. Chúc may mắn, và nếu bất cứ ai có một cách dễ dàng hơn, tôi cũng muốn biết.

Hướng dẫn python pillow rotate text - trăn gối xoay văn bản

Đã trả lời ngày 29 tháng 10 năm 2008 lúc 4:55Oct 29, 2008 at 4:55

user12861user12861user12861

2.2714 Huy hiệu vàng22 Huy hiệu bạc37 Huy hiệu đồng4 gold badges22 silver badges37 bronze badges

Các câu trả lời trước đó vẽ vào một hình ảnh mới, xoay nó và vẽ nó trở lại vào hình ảnh nguồn. Điều này để lại các tạo tác văn bản. Chúng tôi không muốn điều đó.

Dưới đây là một phiên bản thay vì cây trồng khu vực của hình ảnh nguồn sẽ được vẽ, xoay nó, vẽ vào đó và xoay nó trở lại. Điều này có nghĩa là chúng tôi vẽ lên bề mặt cuối cùng ngay lập tức, mà không cần phải dùng đến mặt nạ.

def draw_text_90_into (text: str, into, at):
    # Measure the text area
    font = ImageFont.truetype (r'C:\Windows\Fonts\Arial.ttf', 16)
    wi, hi = font.getsize (text)

    # Copy the relevant area from the source image
    img = into.crop ((at[0], at[1], at[0] + hi, at[1] + wi))

    # Rotate it backwards
    img = img.rotate (270, expand = 1)

    # Print into the rotated area
    d = ImageDraw.Draw (img)
    d.text ((0, 0), text, font = font, fill = (0, 0, 0))

    # Rotate it forward again
    img = img.rotate (90, expand = 1)

    # Insert it back into the source image
    # Note that we don't need a mask
    into.paste (img, at)

Hỗ trợ các góc khác, màu sắc, vv là tầm thường để thêm.

Đã trả lời ngày 27 tháng 4 năm 2021 lúc 15:20Apr 27, 2021 at 15:20

Hướng dẫn python pillow rotate text - trăn gối xoay văn bản

mafumafumafu

30.7K39 Huy hiệu vàng144 Huy hiệu bạc244 Huy hiệu đồng39 gold badges144 silver badges244 bronze badges

2

Nếu bạn sử dụng AGGDRAW, bạn có thể sử dụng SetTransform () để xoay văn bản. Đó là một chút không có giấy tờ, vì effbot.org là ngoại tuyến.

# Matrix operations
def translate(x, y):
    return np.array([[1, 0, x], [0, 1, y], [0, 0, 1]])


def rotate(angle):
    c, s = np.cos(angle), np.sin(angle)
    return np.array([[c, -s, 0], [s, c, 0], [0, 0, 1]])


def draw_text(image, text, font, x, y, angle):
    """Draw text at x,y and rotated angle radians on the given PIL image"""
    m = np.matmul(translate(x, y), rotate(angle))
    transform = [m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2]]
    draw = aggdraw.Draw(image)
    draw.settransform(transform)
    draw.text((tx, ty), text, font)
    draw.settransform()
    draw.flush()

Đã trả lời ngày 22 tháng 8 lúc 13:11Aug 22 at 13:11