2012-05-01 42 views
7

Sau khi đã dành hai ngày cố gắng rasterize jpeg từ chuỗi SVG bằng ImageMagick, tôi đã từ bỏ.Cách chuyển đổi chuỗi SVG thành jpg bằng Inkscape

Mặc dù tôi đã quản lý để chuyển đổi thực sự hoạt động tốt có vẻ như Imagemagick không thể chuyển đổi chính xác các tính năng chuyển đổi/xoay chính xác khi kết xuất hình ảnh, để lại kết quả khác với SVG gốc.

Sau khi nghiên cứu thêm, dường như đây là vấn đề đã biết và 'Inkscape' là phương pháp tốt nhất để sử dụng để chuyển đổi SVG thành jpeg/png trong PHP.

Vấn đề là dữ liệu SVG của tôi được gửi tới tập lệnh PHP của tôi qua JSON. Làm thế nào để có được một blob hoặc chuỗi vào dòng lệnh Inkscape để có nó được chuyển đổi?

Rất cám ơn mọi đề xuất.

Trả lời

2

Nếu bạn có chuỗi SVG, và bạn đang gửi nó từ trình duyệt đến máy chủ qua AJAX, bạn sẽ cần ghi nó vào tệp tạm thời để có thể tham chiếu từ dòng lệnh Inkscape. Bạn không thể render thành JPEG bằng cách sử dụng dòng lệnh Inkscape, nhưng bạn có thể render thành PNG một cách dễ dàng, và nếu bạn thực sự cần một định dạng khác, tất nhiên bạn có thể chuyển đổi bằng ImageMagick sau đó.

Bạn sẽ cần một cái gì đó như:

/path/to/inkscape \ 
    --without-gui \ 
    --export-png=/path/to/output.png \ 
    /tmp/file/input.svg 

Nếu bạn đang chấp nhận đầy đủ/một phần đầu vào SVG từ người sử dụng, hãy nhớ có một số tốt các vấn đề bảo mật mà bạn cần phải ghi nhớ. Hạnh phúc để mở rộng về điều này nếu cần thiết.

+0

Tất nhiên, tôi không thể tin là mình không nghĩ về điều đó. Đầu vào SVG là tất cả phía máy khách được tạo trong ứng dụng (kéo và chuyển đổi đối tượng/hình ảnh, v.v.) để người dùng không bao giờ thực sự nhập bất kỳ mã SVG nào. Điều đó nói rằng điều này vẫn còn một số lỗ hổng bảo mật mà tôi cũng nhận thức được. Cảm ơn câu trả lời nhanh chóng và chính xác! – gordyr

+0

Không có probs. Vì vậy, miễn là bạn biết về các lỗ hổng bảo mật - tôi đang làm việc trên một ứng dụng mà trong đó người dùng tải lên một tài liệu SVG, và tôi đang tìm kiếm các "tính năng" thú vị thường xuyên! – halfer

+0

Tôi chỉ có thể tưởng tượng những gì bạn phải đối mặt với cái đó! ouch! ... Cảm ơn lần nữa :-) – gordyr

3

Bạn có thể chuyển chuỗi SVG của mình tới inkscape bằng stdin, nhưng mã không thể di chuyển được.

// Open Inkscape process 
$process = proc_open(
    '/path/to/inkscape -z -f /dev/fd/0 -e /path/to/output' 
    array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), 
    $pipes 
); 

// Write svg to stdin 
fwrite($pipes[0], $svg); 

// Close process 
foreach ($pipes as $pipe) fclose($pipe); 
proc_close($process); 
Các vấn đề liên quan