Làm cách nào để căn giữa văn bản (và giữa thẳng đứng) khi sử dụng PIL?Văn bản trung tâm/căn giữa với PIL?
Trả lời
Sử dụng Draw.textsize
method để tính kích thước văn bản và tính lại vị trí tương ứng.
Dưới đây là một ví dụ:
from PIL import Image, ImageDraw
W, H = (300,200)
msg = "hello"
im = Image.new("RGBA",(W,H),"yellow")
draw = ImageDraw.Draw(im)
w, h = draw.textsize(msg)
draw.text(((W-w)/2,(H-h)/2), msg, fill="black")
im.save("hello.png", "PNG")
và kết quả:
Sử dụng phương pháp textsize
(xem docs) để tìm ra kích thước của đối tượng văn bản của bạn trước khi thực sự vẽ nó. Sau đó vẽ nó bắt đầu tại tọa độ thích hợp.
Dưới đây là một số mã ví dụ trong đó sử dụng textwrap chia một đường dài thành từng mảnh, và sau đó sử dụng textsize
để tính toán các vị trí.
from PIL import Image, ImageDraw, ImageFont
import textwrap
astr = '''The rain in Spain falls mainly on the plains.'''
para = textwrap.wrap(astr, width=15)
MAX_W, MAX_H = 200, 200
im = Image.new('RGB', (MAX_W, MAX_H), (0, 0, 0, 0))
draw = ImageDraw.Draw(im)
font = ImageFont.truetype(
'/usr/share/fonts/truetype/msttcorefonts/Arial.ttf', 18)
current_h, pad = 50, 10
for line in para:
w, h = draw.textsize(line, font=font)
draw.text(((MAX_W - w)/2, current_h), line, font=font)
current_h += h + pad
im.save('test.png')
+1 cho ví dụ sử dụng tham số phông chữ tùy chọn – btk
Bạn có thể tìm thấy một thực hiện điều này tại http://tools.jedutils.com/tools/center-text-image
Bạn có thể sử dụng trang đó để tạo hình ảnh ngay tại đó thay vì thực hiện các thói quen mình nhưng mã sử dụng được bao gồm trên cũng vậy.
Một lưu ý rằng phương thức Draw.textsize không chính xác. Tôi đã làm việc với hình ảnh pixel thấp, và sau khi thử nghiệm một số, nó bật ra rằng textize xem xét mọi nhân vật được 6 điểm ảnh rộng, trong khi một "tôi" mất tối đa. 2 pixel và "W" mất tối thiểu. 8 pixel (trong trường hợp của tôi). Và như vậy, tùy thuộc vào văn bản của tôi, nó đã hoặc không được tập trung ở tất cả. Mặc dù, tôi đoán "6" là trung bình, vì vậy nếu bạn đang làm việc với các văn bản dài và hình ảnh lớn, nó vẫn nên được ok.
Nhưng bây giờ, nếu bạn muốn có một số chính xác thực, bạn sử dụng tốt hơn các phương pháp getSize của đối tượng font bạn đang sử dụng:
arial = ImageFont.truetype("arial.ttf", 9)
w,h = arial.getsize(msg)
draw.text(((W-w)/2,(H-h)/2), msg, font=arial, fill="black")
Như được sử dụng trong liên kết Edilio của.
- 1. căn giữa trung tâm văn bản với android
- 2. trung tâm theo chiều dọc xoay văn bản với CSS
- 3. Văn bản trung tâm trong ô bảng
- 4. Văn bản trung tâm trong UILabel
- 5. Nút android văn bản trung tâm
- 6. Văn bản trung tâm trên một bitmap
- 7. Thêm văn bản trên hình ảnh bằng PIL
- 8. python PIL vẽ văn bản nhiều dòng trên hình ảnh
- 9. Vẽ văn bản đa ngôn ngữ bằng PIL
- 10. Văn bản trung tâm theo chiều dọc trong nhập văn bản trong IE9 + IE10
- 11. Cắt ngắn văn bản tiếng Trung
- 12. Cắt ảnh ở trung tâm bằng cách sử dụng PIL
- 13. Chọn văn bản trên tập trung
- 14. tập trung vào hộp văn bản
- 15. cách tập trung chỉnh sửa văn bản
- 16. Văn bản trong UITextField sẽ không tập trung đúng cách
- 17. CSS toàn màn hình div với văn bản ở giữa
- 18. Viết văn bản với dấu phụ ("nikud", nhãn hiệu) bằng PIL (Thư viện ảnh Python)
- 19. Văn bản trung tâm trong bánh mì nướng trong Android
- 20. Văn bản trung tâm Java trong hình chữ nhật
- 21. Vẽ văn bản ở giữa
- 22. trung văn bản trong một bảng trong Twitter Bootstrap
- 23. Văn bản bên trái, giữa và văn bản phải trên cùng một dòng
- 24. Văn bản trình giữ chỗ của Trung tâm trong iPhone
- 25. Trung tâm căn chỉnh văn bản - shell script
- 26. Đầu ra văn bản trung tâm từ Graphics.DrawString()
- 27. sử dụng trung tâm căn chỉnh văn bản trong colgroup
- 28. Văn bản Android TextView sẽ không tập trung
- 29. Làm cách nào để căn giữa văn bản trong văn bản?
- 30. JQuery tập trung vào hộp văn bản đầu tiên hoặc văn bản khi trang tải
draw.textsize: (tự, văn bản, phông chữ = Không) – WeizhongTu
Nếu cỡ chữ của bạn khác nhau, điều quan trọng là phải bao gồm phông chữ như sau: 'draw.textsize (msg, font = myFont)', nếu không nó sẽ thắng 't lấy đúng cách trung tâm – Coco