2012-05-16 24 views
8

Tôi có phần tử SVG được xác định với chiều rộng và chiều cao là "297mm" và "210mm" và không có hộp xem. Tôi làm điều này bởi vì tôi muốn làm việc bên trong một khung nhìn A4, nhưng tôi muốn tạo các phần tử theo pixel.Chia tỷ lệ các đối tượng SVG được xác định bằng pixel thành các đơn vị vật lý?

Tại một số điểm, tôi cần phải mở rộng một đối tượng được xác định bằng pixel sao cho nó vừa với một phần của trang A4. Ví dụ, tôi có thể có một đối tượng rộng 100 px, mà tôi muốn mở rộng đến 30mm theo chiều ngang.

Điều này có khả thi không? Tôi nghĩ rằng tôi cần một container thứ hai với một hệ thống phối hợp mới, nhưng tôi không thể tìm thấy bất kỳ cách nào để làm điều này.

EDIT

Dường như tôi (hoặc SVG) đã hiểu lầm những gì một pixel. Tôi nhận ra rằng tôi có thể kích thước một dòng đến 100%, và sau đó nhận được kích thước pixel của nó với getBBox để tìm tỷ lệ yêu cầu. Tôi đã viết mã này và chạy nó trên 2 khách hàng, một với một màn hình 1280x1024 (80dpi), và một với màn hình LCD 1680x1050 (90dpi):

function getDotsPerInch() { 
    var hgroup, vgroup, hdpi, vdpi; 

    hgroup = svgDocument.createElementNS(svgNS, "g"); 
    vgroup = svgDocument.createElementNS(svgNS, "g"); 
    svgRoot.appendChild(hgroup); 
    svgRoot.appendChild(vgroup); 

    drawLine(hgroup, 0, 100, "100%", 100, "#202020", 1, 1); 
    drawLine(vgroup, 100, 0, 100, "100%", "#202020", 1, 1); 

    hdpi = hgroup.getBBox().width * 25.4/WIDTH; 
    vdpi = vgroup.getBBox().height * 25.4/HEIGHT; 

    drawText(hgroup, "DPI, horizontal: " + hdpi.toFixed(2), 100, 100); 
    drawText(hgroup, "DPI, vertical: " + vdpi.toFixed(2), 100, 120); 
} 

IE9, FF, Opera và Chrome đều đồng ý rằng cả hai màn hình là dpi theo chiều ngang và chiều dọc (mặc dù Opera hơi không chính xác) và Safari báo cáo 0 dpi trên cả hai màn hình. Vì vậy, svg dường như đã xác định "pixel" là "96dpi". một số Googling nhanh chóng xuất hiện để xác nhận điều này, mặc dù tôi đã không tìm thấy bất cứ điều gì dứt khoát, và hầu hết các truy cập cho 90dpi, với 96dpi là biến thể FF.

+1

Tại sao một số người nghĩ rằng điều này cần đóng? –

+0

Wow - câu hỏi này là một năm tuổi, nêu ra một điểm quan trọng liên quan đến định nghĩa của dpi cho SVG, rõ ràng liên quan đến SVG, và cho thấy một số nỗ lực nghiên cứu. Và, mặc dù vậy, 5 người đã quyết định đóng nó như là một chủ đề không chính thức, và một người nào đó đã từ chối bình chọn nó. Bất cứ ai quan tâm để giải thích? – EML

+0

Và một trong số họ là 16 tuổi, và không ai trong số họ dường như có bất kỳ quan tâm đến SVG ... – EML

Trả lời

0

Bạn có thể lồng các phần tử <svg> và sử dụng thuộc tính viewBox trên phần tử con để có được hệ tọa độ mới. Cung cấp cho các thuộc tính con của các thuộc tính x, y, chiều rộng và chiều cao của thuộc tính <svg> nơi bạn muốn nó xuất hiện trên cha mẹ trong hệ thống phối hợp của cha mẹ.

+0

Cảm ơn - Cuối cùng tôi đã nhận ra điều này, đã thử nó và đi đến kết luận rằng nó vô dụng. Nếu tôi thiết lập hệ thống phối hợp mới với chế độ xem được đặt thành chiều rộng "297mm" và chiều cao là "210mm" và khung xem được đặt thành '0 0 297 210', thì (1) nếu bạn gắn thêm kích thước pixel đối tượng từ khung nhìn cũ đến mới, sau đó 'getBBox' trong chế độ xem mới chỉ báo cáo chính xác cùng kích thước pixel; và (2) nếu bạn tạo một đối tượng mới với kích thước "100px" một cách rõ ràng, nó thực sự được vẽ là 100mm. Tuy nhiên, tất cả điều này dường như là một điểm tranh luận - xem chỉnh sửa của tôi ở trên. – EML

+0

Trình duyệt giả định chuyển đổi cố định pixel thành mm là 25.4/96.0 Nếu bạn muốn chuyển đổi đơn vị thì bạn có thể chỉ định viewBox sử dụng hệ số chuyển đổi đó. –

+0

@RobertLongson vui lòng giúp eme về vấn đề này http://stackoverflow.com/questions/15452397/resize-svg-paths-with-physical-mesaurement-unit – Mihir

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