Thay vào đó là một giải pháp tốt hơn:
đi đến Extensions -> Images -> Extract Image...
đó, bạn có thể lưu hình ảnh raster đã chọn dưới dạng tệp. Tuy nhiên phần mở rộng này hoạt động kỳ lạ và bằng cách nào đó hoạt động khá chậm (nhưng hoàn toàn tốt).
Một lưu ý khác: phần mở rộng này rất cồng kềnh và chết lặng trên các hình ảnh lớn khác nhau. Ngoài ra, với số lượng lớn hình ảnh raster, nó có thể tăng mức sử dụng bộ nhớ của inkscape lên mức khủng khiếp (như 3GB chỉ sau một số ít hình ảnh được trích xuất).
Bởi vì tôi đã có khoảng 20 tệp svg với khoảng 70 ảnh raster trong mỗi tệp, mỗi ảnh có kích thước tối thiểu 1MB, tôi cần một giải pháp khác nhau. Sau khi kiểm tra ngắn bằng cách sử dụng mẹo Denilson Sá, tôi đã nghĩ ra tập lệnh php sau, trích xuất hình ảnh từ các tập tin svg:
#!/usr/bin/env php
<?php
$svgs = glob('*.svg');
$existing = array();
foreach ($svgs as $svg){
mkdir("./{$svg}.images");
$lines = file($svg);
$img = 0;
foreach ($lines as $line){
if (preg_match('%xlink:href="data:([a-z0-9-/]+);base64,([^"]+)"%i', $line, $regs)) {
$type = $regs[1];
$data = $regs[2];
$md5 = md5($data);
if (!in_array($md5, $existing)) {
$data = str_replace(' ', "\r\n", $data);
$data = base64_decode($data);
$type = explode('/', $type);
$save = "./{$svg}.images/{$img}.{$type[1]}";
file_put_contents($save, $data);
$img++;
$existing[] = $md5;
}
} else {
$result = "";
}
}
}
echo count($existing);
Bằng cách này tôi có thể có được tất cả các hình ảnh tôi muốn và md5 giúp tôi không bị lặp lại các hình ảnh.
Tôi cá là phải có một cách khác đơn giản hơn rất nhiều, nhưng phải đến các nhà phát triển inkscape để làm điều đó tốt hơn.