Tôi đang vẽ văn bản trong canvas HTML5 phía trên hình ảnh (trình tạo meme). Tôi muốn tính toán kích thước phông chữ sao cho chuỗi sẽ kéo dài toàn bộ chiều rộng của canvas. Vì vậy, về cơ bản, có cách nào trong JavaScript để xác định kích thước phông chữ nào tôi nên sử dụng cho một số chuỗi của một phông chữ nhất định cho chiều rộng nhất định không? Không.Xác định chiều rộng của chuỗi trong canvas HTML5
Trả lời
Phương thức fillText()
có đối số thứ tư tùy chọn, là chiều rộng tối đa tối đa để hiển thị chuỗi.
Tài liệu MDN cho biết ...
maxWidth
bắt buộc; chiều rộng tối đa cần vẽ. Nếu được chỉ định và chuỗi là được tính để rộng hơn chiều rộng này, phông chữ được điều chỉnh để sử dụng phông chữ có độ ngang theo chiều ngang hơn (nếu có sẵn hoặc nếu có một cách hợp lý có thể đọc được bằng cách mở rộng phông chữ hiện tại theo chiều ngang) hoặc phông chữ nhỏ hơn.
Tuy nhiên, tại thời điểm viết, đối số này không được hỗ trợ tốt qua trình duyệt, dẫn đến giải pháp thứ hai sử dụng measureText()
để xác định kích thước của chuỗi mà không hiển thị.
var width = ctx.measureText(text).width;
Dưới đây là làm thế nào tôi có thể làm điều đó ...
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d');
// Font sizes must be in descending order. You may need to use `sort()`
// if you can't guarantee this, e.g. user input.
var fontSizes = [72, 36, 28, 14, 12, 10, 5, 2],
text = 'Measure me!';
// Default styles.
ctx.textBaseline = 'top';
ctx.fillStyle = 'blue';
var textDimensions,
i = 0;
do {
ctx.font = fontSizes[i++] + 'px Arial';
textDimensions = ctx.measureText(text);
} while (textDimensions.width >= canvas.width);
ctx.fillText(text, (canvas.width - textDimensions.width)/2, 10);
Tôi có danh sách các kích thước phông chữ theo thứ tự giảm dần và tôi lặp qua danh sách, xác định xem văn bản được hiển thị có vừa với kích thước canvas hay không.
Nếu có, tôi sẽ căn chỉnh giữa văn bản. Nếu bạn phải có đệm ở bên trái và bên phải của văn bản (trông đẹp hơn), hãy thêm giá trị đệm vào textDimensions.width
khi tính toán nếu văn bản phù hợp.
Nếu bạn có danh sách dài các kích thước phông chữ để thử, bạn nên sử dụng một số binary search algorithm. Tuy nhiên, điều này sẽ làm tăng tính phức tạp của mã của bạn.
Ví dụ: nếu bạn có 200 kích thước phông chữ, phép lặp tuyến tính thông qua các phần tử mảng sẽ là O (n).
Chẻ nhị phân phải là O (log n).
Dưới đây là ruột của hàm.
var textWidth = (function me(fontSizes, min, max) {
var index = Math.floor((min + max)/2);
ctx.font = fontSizes[index] + 'px Arial';
var textWidth = ctx.measureText(text).width;
if (min > max) {
return textWidth;
}
if (textWidth > canvas.width) {
return me(fontSizes, min, index - 1);
} else {
return me(fontSizes, index + 1, max);
}
})(fontSizes, 0, fontSizes.length - 1);
Tôi có mã tiếp theo và nó hoạt động hoàn hảo cho tôi. Có thể có một lỗi nhỏ nhưng tôi không cần phải có danh sách các kích thước phông chữ.Tôi chỉ nhận được chiều rộng với kích thước phông chữ và nếu nó quá lớn, tôi tính toán kích thước tỷ lệ tùy thuộc vào chiều rộng và chiều rộng của vải (50)
ctx.font = FONT_SIZE+"pt Verdana";
var textWidth = ctx.measureText(markText).width;
if(textWidth > canvas.width - 50) {
ctx.font = parseInt(FONT_SIZE*(canvas.width-50)/textWidth)+"pt Verdana";
textWidth = ctx.measureText(markText).width;
}
ctx.textBaseline = "middle";
ctx.fillStyle = "rgba(255,255,255,0.5)";
ctx.strokeStyle = "rgba(0,0,0,0.5)";
var xT = image.width/2 - textWidth/2;
var yT = image.height/2;
ctx.fillText(markText, xT, yT);
ctx.strokeText(markText, xT, yT);
- 1. Xác định chiều rộng của chuỗi in bằng webapp
- 2. Xác định chiều rộng của chiều rộng cột rộng CSS3 DIV động cố định chiều rộng cột cố định
- 3. Cắt xén vải/Xuất khẩu vải html5 với chiều rộng và chiều cao nhất định
- 4. HTML5 Canvas Vẽ Rect - Có biên giới của chiều rộng Diff?
- 5. iOS. Xác định chiều rộng dòng cuối cùng của UILabel
- 6. Xác định chiều rộng/chiều cao css trong các đơn vị độc lập của thiết bị?
- 7. ảnh Responsive vs xác định chiều rộng và chiều cao của một hình ảnh trong HTML
- 8. Chiều rộng đầu vào ngày HTML5
- 9. Tách trong canvas HTML5?
- 10. "Xóa" trong html5 canvas
- 11. Chiều rộng và chiều rộng của HTML 'td'
- 12. Đo chiều rộng pixel của một chuỗi
- 13. Html5 Canvas Limitations
- 14. Chỉ định Chiều rộng và Chiều cao của Lô
- 15. Bắt thực chiều rộng đoạn video HTML5 và chiều cao
- 16. Bricket cho trò chơi canvas HTML5
- 17. Chèn từ trong HTML5 Canvas
- 18. Chiều rộng cố định của cột jqgrid?
- 19. Xác định đối tượng nào trên màn hình được nhấp trong html5 canvas javascript?
- 20. Animated GIF trong HTML5 canvas
- 21. Đặt chiều cao và chiều rộng của phần tử canvas thành window.innerHeight/innerWidth tạo thanh cuộn
- 22. Hình chữ nhật trên Canvas HTML5 được kéo dài
- 23. Rất lớn vòng tròn canvas HTML5 không chính xác
- 24. Phần tử canvas html5 trong nền của trang của tôi?
- 25. Fabric.js: Canvas có chiều rộng 100% có thể?
- 26. Xác định tất cả các phần tử con chiều rộng
- 27. HTML5 Canvas fillText với chuỗi từ phải sang trái
- 28. Cách lấy chiều rộng chuỗi
- 29. HTML5 Tự động tạo Canvas
- 30. Chiều cao và chiều rộng của video HTML5 thông qua javascript
Liên kết tới tài liệu và/hoặc mã ví dụ có thể đẹp. – Phrogz
@Phrogz Kiểm tra câu trả lời cập nhật. :) – alex
Tôi nên biết bạn không nhận được 90k + rep bằng cách không theo dõi. :) Rất đẹp. – Phrogz