2009-12-27 13 views
5

tôi sử dụng hai phương pháp sau đây để tạo ra hình ảnh xem trước văn bản cho một tập tin phông chữ .ttfImageFont's getize() không nhận được kích thước văn bản chính xác?

phương pháp PIL:

def make_preview(text, fontfile, imagefile, fontsize=30): 
    try: 
     font = ImageFont.truetype(fontfile, fontsize) 
     text_width, text_height = font.getsize(text) 
     img = Image.new('RGBA', (text_width, text_height)) 
     draw = ImageDraw.Draw(img) 
     draw.text((0, 0), text, font=font, fill=(0, 0, 0)) 
     return True 
    except: 
     return False 

ImageMagick phương pháp:

def make_preview(text, fontfile, imagefile, fontsize=30): 
    p = subprocess.Popen(['convert', '-font', fontfile, '-background', 
      'transparent', '-gravity', 'center', '-pointsize', str(fontsize), 
      '-trim', '+repage', 'label:%s' % text, image_file]) 
    return p==0 

Cả hai phương pháp tạo ra hình ảnh xem trước chính xác hầu hết thời gian nhưng trong một số trường hợp hiếm hoi (< 2%), font.getsize (văn bản) chỉ cann ot nhận được kích thước văn bản chính xác dẫn đến canvas được cung cấp tràn văn bản. ImageMagick có cùng một vấn đề.

phông chữ mẫu và xem trước:

HANFORD.TTF http://download.appfile.com/HANFORD.png

NEWTOW.TTF http://download.appfile.com/NEWTOW.png

MILF.TTF http://download.appfile.com/MILF.png

SWANSE.TTF http://download.appfile.com/SWANSE.png

Tôi đã xem xét tài liệu của ImageMagick và tìm thấy giải thích về vấn đề này tại http://www.imagemagick.org/Usage/text/#overflow.

Có thể phát hiện các luồng văn bản như vậy và vẽ văn bản để vừa với canvas như chúng tôi mong đợi không?

Trả lời

1

Trong trường hợp này, chỉ cần chỉ định ImageMagick để sử dụng kích thước canvas lớn hơn với kích thước phông chữ cố định và nó sẽ vẽ văn bản ở kích thước điểm được chỉ định trong khi giữ nguyên toàn vẹn.

def make_preview(text, fontfile, imagefile, fontsize=30): 
    p = subprocess.call(['convert', '-font', fontfile, '-background', 
     'transparent', '-gravity', 'center', '-size', '1500x300', 
     '-pointsize', str(fontsize), '-trim', '+repage', 'label:%s' % text, image_file]) 
    return p==0 

Nếu bạn cần đặt văn bản vào khung được chỉ định thay vì sử dụng kích thước điểm cố định, bạn có thể cần phải đổi kích thước hình ảnh đầu ra sau khi được tạo.

PIL không làm điều này rất tốt vẽ phông chữ kỳ lạ, không có vấn đề gì kích thước điểm bạn chỉ định để tải một phông chữ, nó luôn luôn tràn văn bản bên ngoài hình ảnh đầu ra.

2

Tôi gặp sự cố tương tự một lần trong PHP và ImageMagick.

Cuối cùng, tôi đã giải quyết vấn đề này bằng cách vẽ văn bản trên một khung hình rất lớn và sau đó cắt nó bằng cách sử dụng các chức năng trim/auto-crop để tiết kiệm thêm không gian khỏi hình ảnh.

Nếu tôi hiểu chức năng xem trước của bạn ngay, nó thực sự đã làm chính xác rằng: Nó sẽ là đủ để chỉ cần loại bỏ các thiết lập chiều rộng và chiều cao.

+0

@Pekka, phương pháp của bạn có thể hoạt động với IM nhưng sẽ tạo ra chi phí lớn, không chỉ cắt mà còn thay đổi kích thước hình ảnh đã cắt để vừa với kích thước canvas được chỉ định. Điều này không làm việc với PIL. Nó luôn luôn rút ra một nửa trên của các phông chữ trên thậm chí tôi tạo ra một khung lớn hơn. – jack

+0

Thử đặt lệnh "nhãn" * trước * các lệnh cắt và sửa đổi, điều đó sẽ hoạt động. Các chi phí, tôi không thể giúp đỡ. –

5

alt text http://img9.imageshack.us/img9/2419/fontfix.jpg

Không phải là một giải pháp lập trình, nhưng khi tôi tái tạo vấn đề của bạn, nó chỉ xảy ra trên phông chữ của bạn (phông chữ khác như Arial là không có vấn đề gì cả), vì vậy tôi đã cố định các file font của bạn (bằng cách thay đổi đi lên/số liệu phong nha).bạn có thể tải xuống here,

Và xin lỗi về Hanford Script Font, nó không hoàn hảo như bạn thấy, chiều cao có vẻ ok, nhưng bên trái không được rút ra, theo hiểu biết của tôi.

CẬP NHẬT: Về Hanford Font, Đây là một công trình xung quanh, vượt qua thêm không gian trong văn bản như "Handford Script", và sau đó cắt thêm không gian trong hình ảnh như img=img.crop(img.getbbox())

alt text http://img64.imageshack.us/img64/1903/hanfordfontworkaround.jpg

UPDATE2: Tôi phải chuyển màu = (255,255,255) trong Image.New để lấy Văn bản màu đen trên nền trắng

img = Image.new('RGBA', (text_width, text_height),color=(255,255,255)) 

alt text http://img245.imageshack.us/img245/3462/colorblackh.jpg

+0

cách sửa đổi chỉ số tăng/giảm cho một phông chữ được chỉ định? Là cần tái calucation cần thiết trên một cơ sở cho mỗi phông chữ? – jack

+0

Tôi đã sử dụng phông chữ để chỉnh sửa các phông chữ, giắc cắm. – YOU

+0

Do vấn đề bản quyền, tôi nghĩ tốt hơn là nên để nguyên phông chữ và vẽ văn bản trên canvas lớn hơn rồi cắt nó. nhưng phương pháp của bạn làm việc để sử dụng cá nhân. Cảm ơn lời khuyên của bạn. – jack

Các vấn đề liên quan