2013-05-04 47 views
55

Tôi có ứng dụng tải hình ảnh và khi người dùng nhấp vào hình ảnh, khu vực văn bản xuất hiện cho Hình ảnh này (sử dụng jquery), nơi người dùng có thể viết một số văn bản trên Hình ảnh. Nội dung nào sẽ được thêm vào Hình ảnh.Thêm văn bản trên hình ảnh bằng PIL

Sau khi thực hiện một số nghiên cứu về nó, tôi đã tìm ra rằng PIL (Thư viện hình ảnh Python) có thể giúp tôi thực hiện việc này. Vì vậy, tôi đã thử một vài ví dụ để xem nó hoạt động như thế nào và tôi đã viết văn bản trên một hình ảnh. Nhưng tôi nghĩ rằng có một số khác biệt khi tôi thử nó bằng cách sử dụng Python Shell và trong môi trường web. Tôi có nghĩa là văn bản trên textarea là rất lớn trong px. Làm thế nào tôi có thể đạt được cùng một kích thước của văn bản khi sử dụng PIL như là một trên textarea?

Văn bản là Đa dòng. Làm thế nào tôi có thể làm cho nó multiline trong hình ảnh cũng có, sử dụng PIL?

Có cách nào tốt hơn so với sử dụng PIL không? Tôi không hoàn toàn chắc chắn, Nếu đây là triển khai tốt nhất.

html:

<img src="images/test.jpg"/> 

của nó hình ảnh đang được chỉnh sửa

var count = 0; 
$('textarea').autogrow(); 
$('img').click(function(){ 
    count = count + 1; 
    if (count > 1){ 
     $(this).after('<textarea />'); 
     $('textarea').focus(); 
    } 
}); 

các jquery để thêm textarea. Ngoài ra vùng văn bản là vị trí: kích thước tuyệt đối và cố định.

Tôi có nên đặt nó bên trong biểu mẫu để tôi có thể nhận tọa độ của vùng văn bản trên hình ảnh không? Tôi muốn viết văn bản trên hình ảnh khi người dùng nhấp và lưu nó trên hình ảnh.

+0

Tại sao bạn muốn viết văn bản trên hình ảnh bằng PIL (và tôi không chắc chắn nếu PIL trợ giúp điều đó). Không phải là nó đủ tốt để bạn có thể hiển thị văn bản trong lớp phủ, được sử dụng phổ biến nhất trong thanh trượt. – lalit

+1

Tôi cần nó cho một dự án tôi muốn lưu hình ảnh. Pil có thể vẽ văn bản trên một hình ảnh bằng cách sử dụng ImageDraw, không biết nếu có một cách khác. – Apostolos

+0

Sẽ hữu ích nếu bạn có thể cung cấp mã Python bạn đang sử dụng? – lalit

Trả lời

106

Tôi nghĩ rằng ImageFont mô-đun có sẵn trong PIL sẽ hữu ích trong việc giải quyết vấn đề kích thước phông chữ. Chỉ cần kiểm tra loại phông chữ và kích thước nào phù hợp với bạn và sử dụng chức năng sau để thay đổi giá trị phông chữ.

# font = ImageFont.truetype(<font-file>, <font-size>) 
# font-file should be present in provided path. 
font = ImageFont.truetype("sans-serif.ttf", 16) 

Vì vậy, mã của bạn sẽ trông giống tương tự như:

from PIL import Image 
from PIL import ImageFont 
from PIL import ImageDraw 

img = Image.open("sample_in.jpg") 
draw = ImageDraw.Draw(img) 
# font = ImageFont.truetype(<font-file>, <font-size>) 
font = ImageFont.truetype("sans-serif.ttf", 16) 
# draw.text((x, y),"Sample Text",(r,g,b)) 
draw.text((0, 0),"Sample Text",(255,255,255),font=font) 
img.save('sample-out.jpg') 

Bạn có thể cần phải đặt một số nỗ lực nhiều để tính toán kích thước phông chữ. Trong trường hợp bạn muốn thay đổi nó dựa trên số lượng người dùng văn bản đã cung cấp trong TextArea.

Để thêm gói văn bản (Đa yếu tố) chỉ cần lấy một ý tưởng thô về số lượng ký tự có thể có trong một dòng, Sau đó bạn có thể viết chức năng tiền xử lý cho Văn bản của bạn, Về cơ bản, tìm ký tự sẽ là cuối cùng trong mỗi dòng và chuyển đổi khoảng trắng trước ký tự này thành dòng mới.

+1

Đó là suy nghĩ ban đầu của tôi.Vì vậy, tôi cần phông chữ của tôi để được trong một thư mục cụ thể trong máy chủ web của tôi để làm việc? Tôi nghĩ có. Bao bì văn bản? Là có một cách tiêu chuẩn hoặc tôi phải thực hiện một? – Apostolos

+0

Bạn có thể giữ tệp phông chữ ở bất cứ đâu trong máy chủ web của mình. Chỉ cần đảm bảo đường dẫn bạn cung cấp là chính xác. – lalit

+3

@ lalit Tôi đã thử mã của bạn trên máy tính Windows và tôi gặp lỗi cho font 'self.font = core.getfont (tệp, kích thước, chỉ mục, mã hóa) IOError: không thể mở tài nguyên'. Làm thế nào tôi có thể cung cấp đường dẫn đến tệp phông chữ? – LWZ

8

Bạn có thể tạo thư mục "phông chữ" trong thư mục gốc của dự án và đặt tệp phông chữ (sans_serif.ttf) tại đó. Sau đó, bạn có thể làm một cái gì đó như thế này:

fonts_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'fonts') 
font = ImageFont.truetype(os.path.join(fonts_path, 'sans_serif.ttf'), 24) 
Các vấn đề liên quan