2011-06-30 31 views
10

Tôi đã cố sử dụng getimagesize() trên tệp SVG nhưng không thành công.Làm thế nào để bạn có được chiều rộng và chiều cao của ảnh SVG trong PHP?

Tôi biết rằng SVG là “Đồ họa vector có thể mở rộng”, nhưng tôi thấy rằng “Các yếu tố đánh giá” của Google Chrome hoàn toàn có thể nhận được kích thước của ảnh SVG, vì vậy tôi nghi ngờ điều này cũng có thể trong PHP.

Nếu gặp khó khăn trong việc lấy kích thước, có cách nào để đánh giá liệu ảnh SVG có dọc hay ngang không?

Trả lời

7

Điều này là: hình ảnh SVG không có "kích thước" theo nghĩa bạn có thể nghĩ đến. Mặt khác, họ DO có tỷ lệ chiều cao đến chiều rộng.

Tỷ lệ này thường có thể được tìm thấy trong thuộc tính viewBox.

Nếu, mặt khác, thuộc tính viewBox không xuất hiện trên phần tử SVG gốc, tỷ lệ hình ảnh rất không cần thiết để xác định.

Edit:

Side lưu ý: Lý do Chrome cung cấp cho bạn tọa độ hoàn hảo là không nhất thiết vì nó nhìn vào SVG để xác định kích cỡ; nó rất có thể là một kết quả đơn giản của nó thiết lập kích thước.

Mặc dù phần tử SVG có các thuộc tính heightwidth, chúng có thể không được chỉ định làm pixel, nhưng bất kỳ một số đơn vị nào, vì vậy chúng không nhất thiết phải trợ giúp nhiều.

+0

@Williham Totland, tôi đã đọc 'viewbox', nhưng có vẻ như 'viewbox' cũng nên đặt' Dimensions' theo cách thủ công, không tự động. làm thế nào để chuyển một 'SVG' sang' viewbox' 'xml file'? nó nên duy trì tỷ lệ khung hình ảnh. Cảm ơn. – cj333

+0

@ cj333: Lỗi phân tích cú pháp. –

+0

@Williham Totland, @Brian, xin lỗi, tôi vẫn chưa biết cách sử dụng nó. ví dụ 'viewbox', nếu tôi biết' width = "500" height = "300" 'tôi có thể dễ dàng nhận được nó. Nhưng tình hình thực tế là tôi không biết điều đó. Tôi chỉ biết url của nó là 'http: // upload.wikimedia.org/wikipedia/commons/6/6c/Cog-scripted-svg.svg' – cj333

9

Một SVG chỉ đơn giản là một tệp XML, do đó, thư viện GD sẽ không có bất kỳ trợ giúp nào!

Bạn chỉ cần có thể phân tích cú pháp tệp XML để nhận các thuộc tính như vậy.

$xml = ' 
<svg width="500" height="300" version="1.1" 
xmlns="http://www.w3.org/2000/svg" 
xmlns:xlink="http://www.w3.org/1999/xlink"> 

<rect x="90" y="10" 
    width="400" height="280" 
    style="fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1; " /> 
</svg>'; 

$xmlget = simplexml_load_string($xml); 
$xmlattributes = $xmlget->attributes(); 
$width = (string) $xmlattributes->width; 
$height = (string) $xmlattributes->height; 
print_r($width); 
print_r($height); 

Các giá trị cần được truyền hoặc chúng sẽ trả về một đối tượng.

+0

cách thực hiện điều đó? sử dụng 'simplexml_load_file (filename.svg)'? Cảm ơn – cj333

+0

Có bạn đi :) - câu trả lời đã chỉnh sửa. Rõ ràng là có được từ tập tin, chỉ cần thực hiện chuỗi XML để hiển thị nó hoạt động. – Brian

+0

Btw, như Williham Totland đã đề cập, chúng có thể không được đảm bảo là pixel trừ khi bạn kiểm soát các tệp SVG và chắc chắn về mọi thứ. – Brian

3

Tôi có cùng một câu hỏi như tôi không thể tìm thấy câu trả lời, sáng tạo và giải quyết như sau:

<?php 
    $svgfile = simplexml_load_file("svgimage.svg"); 
    $width = substr($svgfile[width],0,-2); 
    $height = substr($svgfile[height],0,-2); 
?> 

Lưu ý rằng các tập tin SVG Tôi đã từng được tạo ra trong Adobe Illustrator. Vì vậy, mã svg của hình ảnh bắt đầu như sau:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) --> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
width="400px" height="738px" viewBox="0 0 400 738" enable-background="new 0 0 400 738" xml:space="preserve"> 
... 

Nhờ đó, tôi có thể nhận được giá trị chiều rộng và chiều cao.

Và tôi sử dụng substr$svgfile[width] trả về giá trị bằng hậu tố "px". Tôi cũng có thể sử dụng giá trị viewBox và chia nó để có được các giá trị.

Chúc mừng từ Santiago, Chile

+1

'$ svgfile = simplexml_load_file ($ imageFileName);' 'danh sách ($ x_start, $ y_start, $ x_end, $ y_end) = phát nổ ('', $ svgfile ['viewBox']);' –

+0

Tôi thích giải pháp này nhưng tôi đã thấy các tệp svg có chiều rộng = 100% và chiều cao = 100%, có thể được xem xét. – Jonny

+0

Giải pháp loại bỏ bất kỳ dấu hiệu chữ và số nào về chiều cao và chiều rộng ("px", "%", v.v.): $ svgwidth = preg_replace ("/ [^ 0-9,.] /", "", $ Svgfile [width]); $ svgheight = preg_replace ("/ [^ 0-9,.] /", "", $ Svgfile [chiều cao]); – Jonny

0

Về kích thước cơ bản có ba loại khác nhau của hình ảnh SVG:

  1. kích thước cố định: hình ảnh có widthheight thuộc tính.Chrome có thể hiển thị các kích thước này một cách hoàn hảo và chuyển đổi các đơn vị được chỉ định thành pixel.

  2. Kích thước theo tỷ lệ: Ảnh SVG có thuộc tính viewBox. Chrome hiển thị kích thước của các hình ảnh như vậy được phóng to thành 300x150. Do đó, hình ảnh có tỷ lệ 16: 9 được hiển thị là 267x150.

  3. Không kích thước: hình ảnh SVG mà không width, heightviewBox. Chrome (và các trình duyệt khác) sử dụng kích thước mặc định là 300x150 cho các hình ảnh như vậy.

Có thể thực hiện các kích thước bằng PHP bằng cách đọc nội dung của hình ảnh SVG với PHP DOM extension và áp dụng các quy tắc từ trên cao. Tôi đã viết thư viện PHP contao/imagine-svg mà không chính xác điều đó và có thể được sử dụng như sau:

$size = (new Contao\ImagineSvg\Imagine) 
    ->open('/path/to/image.svg') 
    ->getSize(); 
echo $size->getWidth(); 
echo $size->getHeight(); 

Nếu bạn không muốn dựa vào một thư viện của bên thứ ba, bạn có thể ghé qua source code of the getSize() method để xem cách xác định thư viện kích thước.

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