2009-08-28 22 views
29

Tôi cố gắng tự động tạo tệp SVG nhằm in trên một kích thước nhất định (A4). Tôi muốn sử dụng một con đường trong nó, mà chỉ cho phép 'đơn vị người dùng', không phải 'đơn vị tuyệt đối'. Dường như với tôi rằng không thể 'xuất bản' tệp SVG có đơn vị tuyệt đối (ví dụ: kích thước tài liệu) và đường dẫn ở bất kỳ đâu, bởi vì tôi không thể làm cho nó hoạt động bình thường trên người xem.SVG và DPI, đơn vị tuyệt đối và đơn vị người dùng: Inkscape so với Firefox so với ImageMagick

Có cách nào để có được sự nhất quán trong hiển thị, như chỉ định 'DPI mặc định' không?

Hoặc đặt khác: Tôi có thể lấy ví dụ dưới đây để hiển thị giống nhau trong tất cả người xem mà không bỏ qua các đơn vị tuyệt đối không?

Liên quan: Có cách nào để buộc bất kỳ ứng dụng nào bên dưới hiển thị hình ảnh giống như một trong các ứng dụng khác không? (Ví dụ: Tôi đã thử các -density tùy chọn 'biến đổi', nhưng tôi không thể nhận được đầu ra cho phù hợp với đầu ra của Inkscape hoặc Firefox.)


Ví dụ:

tôi đã tạo ra một tập tin SVG, với ba hình vuông màu đen (rect) với một đường chéo (đường dẫn) màu đỏ:

  • Left: vuông và đường chéo trong các đơn vị sử dụng
  • Trung: vuông và đường chéo trong inch (dường như tôi sự lựa chọn hợp lý nhất, nhưng là không được phép)
  • Phải: vuông mm, đường chéo trong các đơn vị sử dụng

nào làm cho khác nhau trong khán giả khác nhau:

  • Inkscape: 90 DPI, tất cả các hình vuông cùng kích thước, trận đường chéo đỏ
  • Firefox: 96 DPI ?, các ô vuông sau lớn đến ngắn (hoặc đường chéo thành ngắn)
  • Chuyển đổi: 72 DPI, hình vuông sau thành nhỏ (hoặc đường chéo thành dài)

Code:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<svg 
    xmlns:svg="http://www.w3.org/2000/svg" 
    xmlns="http://www.w3.org/2000/svg" 
    version="1.1" 
    width="200mm" 
    height="100mm" 
    > 
    <g transform="translate(50,50)"> 
    <rect 
     width="100." 
     height="100." 
     x="10" 
     y="10" /> 
    <path style="stroke: #ff0000" d="M 10 10 L 110 110" /> 
    </g> 
    <g transform="translate(200,50)"> 
    <rect 
     width="1.111in" 
     height="1.111in" 
     x="0.1111in" 
     y="0.1111in" /> 
    <path style="stroke: #ff0000" d="M 0.1111in 0.1111in L 1.111in 1.111in" /> 
    </g> 
    <g transform="translate(350,50)"> 
    <rect 
     width="1.111in" 
     height="1.111in" 
     x="0.1111in" 
     y="0.1111in" /> 
    <path style="stroke: #ff0000" d="M 10 10 L 110 110" /> 
    </g> 
</svg> 

Inkscape (mặc định của tôi 'xem'):

Alt text

Firefox (lưu ý đường đỏ không đạt góc dưới bên phải. Tôi đã thực hiện một ảnh chụp màn hình và cắt loại tùy tiện):

Firefox

ImageMagick (chuyển đổi, không có tùy chọn bên cạnh tên tập tin nhất định):

Alt text

+0

Tôi tìm thấy http://stackoverflow.com/questions/1132269/can-i-use-mixed-units-with-path-element hữu ích để giải thích sự cố. – BlackShift

+1

Inkscape [0.92] (http://wiki.inkscape.org/wiki/index.php/Release_notes/0.92#Important_changes): Độ phân giải mặc định đã được thay đổi từ 90dpi thành 96dpi, để phù hợp với tiêu chuẩn CSS. – qwert2003

Trả lời

25

Tất cả các khía cạnh trong một đường tag đang ở trong đơn vị người dùng.

Bạn không thể chỉ định các đơn vị tuyệt đối trong vòng một đường thẻ, đó là lý do tại sao con đường ở quảng trường trung không render.

Cách đơn giản nhất tôi đã tìm thấy là để thiết lập các đơn vị sử dụng viewbox:

  • Thiết lập độ rộng & chiều cao theo đơn vị inch.
  • Sau đó đặt chế độ xem là giống nhau.
  • Điều này đặt đơn vị người dùng thành một inch.
  • Tất cả kích thước này sau đó được xác định theo đơn vị inch (lưu ý: tôi đã sử dụng thấp hơn trường hợp l trong thẻ đường để xác định một động thái tương đối)

này sẽ hiển thị một cách chính xác trong Inkscape và Firefox.

<svg 
    xmlns:svg="http://www.w3.org/2000/svg" 
    xmlns="http://www.w3.org/2000/svg" 
    version="1.1" 
    width="8in" 
    height="4in" 
    viewBox="0 0 8 4"> 

    <g transform="translate(4,0.5)"> 
     <rect 
      width="1.111" 
      height="1.111" 
      x="0.1111" 
      y="0.1111" /> 
     <path d="M 0.1111,0.1111 l 1.111 1.111" style="stroke: #ff0000;stroke-width:0.01" /> 
    </g> 
</svg> 
+0

Điều này thực sự dường như hoạt động như mong đợi! Các hình ảnh được tạo ra bởi inkscape, ff và chuyển đổi tất cả trông giống nhau nhưng có kích thước khác nhau tương ứng với tỷ lệ 96:90:72 trong dpi mặc định. Ít nhất trong inkscape này dễ thay đổi, bất cứ ai một ý tưởng làm thế nào để có được chuyển đổi để sản xuất giống nhau ?. Cả inkscape và convert đều có thể tạo pdf in một hộp có đường thẳng có kích thước 1.1111 inch. – BlackShift

+0

Có lẽ tôi không hiểu tùy chọn mật độ chuyển đổi. Công việc này: để thay đổi dpi mặc định từ 72 thành FF 96 bạn phải chỉ định sqrt (96 * 72) = 83.1 làm mật độ (đối với tệp đầu vào). Vì vậy, 'convert-density 83.1 inputfile.svg outputfile.png' cho cùng một hình ảnh như firefox. – BlackShift

+0

@BlackShift Lệnh 'convert' của ImageMagick nhận đối số' -density XX' (trước khi bạn chỉ định tệp đầu vào) để đặt độ phân giải. – Caleb

1

Tôi đã có một vấn đề tương tự sử dụng Apache Batik để nhúng một tập tin SVG trong một tập tin PDF bằng cách sử iText. iText sử dụng 72   DPI, tiêu chuẩn cho PDF, trong khi Batik sử dụng 96.

Để hình ảnh hiển thị chính xác, tức là, theo tỷ lệ, trong tệp PDF, bạn cần chia chiều rộng = x cm height = y cm trong tiêu đề SVG bằng 1,33 (96/72).

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