Tôi gửi một chuỗi đại diện của một tập tin SVG đến máy chủ và sử dụng Imagick để tắt chức năng này thành một jpeg theo cách sau đây:làm thế nào để thay đổi kích thước tập tin SVG lên với Imagick/ImageMagick
$image = stripslashes($_POST['json']);
$filename = $_POST['filename'];
$unique = time();
$im = new Imagick();
$im->readImageBlob($image);
$im->setImageFormat("jpeg");
$im->writeImage('../photos/' . $type . '/humourised_' . $unique . $filename);
$im->clear();
$im->destroy();
Tuy nhiên tôi muốn thay đổi kích thước SVG trước khi rasterize nó để hình ảnh kết quả lớn hơn kích thước được chỉ định trong tệp SVG.
tôi sửa đổi mã của tôi như sau:
$image = stripslashes($_POST['json']);
$filename = $_POST['filename'];
$unique = time();
$im = new Imagick();
$im->readImageBlob($image);
$res = $im->getImageResolution();
$x_ratio = $res['x']/$im->getImageWidth();
$y_ratio = $res['y']/$im->getImageHeight();
$im->removeImage();
$im->setResolution($width_in_pixels * $x_ratio, $height_in_pixels * $y_ratio);
$im->readImageBlob($image);
$im->setImageFormat("jpeg");
$im->writeImage('../photos/' . $type . '/humourised_' . $unique . $filename);
$im->clear();
$im->destroy();
Mã này nên làm việc ra các quyết định và thay đổi kích thước SVG cho phù hợp. Nó hoạt động hoàn hảo nếu canvas SVG và các phần tử của nó có độ rộng dựa trên 'phần trăm', tuy nhiên nó không hoạt động với các phần tử được xác định trong 'px'. Thật không may là một yêu cầu.
Một chuỗi SVG điển hình mà sẽ được gửi đến máy chủ trông như thế này:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/SVG/DTD/svg10.dtd">
<svg id="tempsvg" style="overflow: hidden; position: relative;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="333" version="1.1" height="444">
<image transform="matrix(1,0,0,1,0,0)" preserveAspectRatio="none" x="0" y="0" width="333" height="444" xlink:href="http://www.songbanc.com/assets/embed/photos/full/133578615720079914224f9e7aad9ac871.jpg"></image>
<image transform="matrix(1,0,0,1,0,0)" preserveAspectRatio="none" x="85.5" y="114" width="50" height="38" xlink:href="http://www.songbanc.com/assets/embed/humourise/elements/thumb/thumb_lips4.png"></image>
<path transform="matrix(1,0,0,1,0,0)" fill="none" stroke="#000" d="M110.5,133L140.5,133" stroke-dasharray="- " opacity="0.5"></path>
<circle transform="matrix(1,0,0,1,0,0)" cx="140.5" cy="133" r="5" fill="#000" stroke="#000"></circle>
<path transform="matrix(1,0,0,1,0,0)" fill="none" stroke="#000" d="M110.5,133L110.5,155.8" stroke-dasharray="- " opacity="0.5"></path>
<circle transform="matrix(1,0,0,1,0,0)" cx="110.5" cy="155.8" r="5" fill="#000" stroke="#000"></circle>
<circle transform="matrix(1,0,0,1,0,0)" cx="110.5" cy="133" r="5" fill="#000" stroke="#000"></circle>
</svg>
Như bạn có thể thấy các yếu tố tạo nên SVG này có độ rộng định nghĩa pixel và chiều cao (sử dụng phần trăm là tiếc không phải là một tùy chọn cho ứng dụng này)
Có cách nào xung quanh vấn đề này không? Hoặc bất kỳ phương pháp chuyển đổi SVG sang png khác và hiển thị nó ở kích thước nhất định mà không làm giảm chất lượng.
Cảm ơn.
EDIT: Mặc dù tôi chưa bao giờ thực sự tìm được giải pháp hoàn hảo. Thay vào đó, tôi đã kết thúc việc gửi dữ liệu SVG dưới dạng json, lặp qua phía máy chủ và chia tỷ lệ pixel thành chiều cao dự kiến.
Sau đó, sau nhiều lần thử và lỗi, tôi nhận ra rằng imagemagick có vấn đề với các lệnh chuyển đổi/xoay SVG chuẩn, ném bất kỳ phần tử thao tác nào ra khỏi vỏ. Tôi đã kết thúc quá trình chuyển đổi 'inkscape' để hiển thị SVG kết quả dưới dạng hình ảnh rasterised. Và tất cả là tốt. Tôi vẫn đang đào sâu vào một giải pháp có tiềm năng để bù đắp những khác biệt mà tưởng tượng tạo ra. Nếu tôi có bất kỳ thành công nào, tôi sẽ cập nhật lại câu hỏi này.
Từ [câu hỏi khác của bạn] (http://stackoverflow.com/questions/10400897/how-to-convert-an-svg-string-into-a-jpg-with-inkscape) Tôi nghi ngờ bạn hiện có chuyển sang Inkscape (có thể chia tỷ lệ hình ảnh bằng các tùy chọn trên dòng lệnh). Nếu đó là trường hợp, bạn sẽ thêm một bình luận bên dưới câu hỏi? ':)'. – halfer
Thật vậy ... tôi sẽ chỉnh sửa câu hỏi của mình cho phù hợp. :-) – gordyr
Rất thích xem thêm chi tiết về giải pháp Inkscape của bạn! – supertrue