내부에 하나 이상의 임베디드 JPG / PNG 이미지가 포함 된 SVG 파일이 있습니다. 해당 SVG 파일에서 JPG / PNG 이미지를 추출하여 디스크에 저장하고 싶습니다.
inkscape
SVG 파일을 편집하는 데 사용하는 프로그램이므로 태그를 추가하고 있지만 다른 도구를 사용하는 솔루션도 허용합니다.
내부에 하나 이상의 임베디드 JPG / PNG 이미지가 포함 된 SVG 파일이 있습니다. 해당 SVG 파일에서 JPG / PNG 이미지를 추출하여 디스크에 저장하고 싶습니다.
inkscape
SVG 파일을 편집하는 데 사용하는 프로그램이므로 태그를 추가하고 있지만 다른 도구를 사용하는 솔루션도 허용합니다.
답변:
내 자신의 솔루션 (또는 ... 해결 방법) :
XML Editor
( Shift+ Ctrl+ X)을 엽니 다xlink:href
이미지를 데이터 로 포함 할 속성을 선택하십시오 . URIdata:
URI를 복사하십시오.data:
URI를 브라우저에 붙여 넣고 거기에서 저장하십시오.또는 텍스트 편집기에서 SVG 파일을 열고 data:
URI를 찾아 복사 할 수 있습니다.
이 솔루션은 효과가 있지만 다소 번거롭고 더 나은 것을 배우고 싶습니다.
대신 더 나은 해결책이 있습니다.
로 이동 Extensions -> Images -> Extract Image...
하면 선택한 래스터 이미지를 파일로 저장할 수 있습니다. 그러나이 확장은 이상하게 작동하고 다소 느리게 작동하지만 완벽하게 작동합니다.
또 다른 참고 사항 :이 확장은 번거롭고 다양한 대형 이미지에서 자동으로 죽습니다. 또한 많은 수의 래스터 이미지를 사용하면 잉크 스케이프의 메모리 사용량을 끔찍한 수준으로 끌어 올릴 수 있습니다 (소량의 이미지 만 추출한 후 3GB).
각각 약 70MB의 래스터 이미지가있는 약 20 개의 svg 파일이 있고 각 이미지의 크기는 최소 1MB이므로 다른 솔루션이 필요했습니다. Denilson Sá tip을 사용하여 짧은 검사 후 svg 파일에서 이미지를 추출하는 다음 PHP 스크립트를 고안했습니다.
#!/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);
이렇게하면 원하는 모든 이미지를 얻을 수 있으며 md5는 반복되는 이미지를 얻지 못하게합니다.
훨씬 더 간단한 다른 방법이 있어야하지만 내기를 더 잘하는 것은 잉크 스케이프 개발자에게 달려 있습니다.
data:
줄에 하나의 URL 만 지원하며 href 속성 내에서 줄 바꿈을 지원하지 않습니다 (inkscape는 데이터 URL에 추가하고, base64 사양은 줄이 76 자 이하 여야합니다 ). 빠른 해킹을위한 멋진 스크립트이지만 모든 종류의 SVG에서는 작동하지 않습니다.
마지막으로 몇 년 후, 적절한 XML 라이브러리를 사용하여 SVG 코드를 구문 분석하여 SVG 파일에서 모든 이미지를 올바르게 추출하는 스크립트를 작성했습니다.
http://bitbucket.org/denilsonsa/small_scripts/src/tip/extract_embedded_images_from_svg.py
이 스크립트는 Python 2.7 용으로 작성되었지만 Python 3으로 쉽게 변환 할 수 있어야합니다. 더 나은 방법으로, 해당 버전에서 도입 된 새로운 기능으로 인해 Python 3.4로 변환 한 후 약 50 줄을 삭제할 수 있습니다.
cElementTree
더 빨라야합니다. 그러나 Sax와 같은 것이 더 잘 작동 할 수도 있습니다.
cElementTree
이 더 빠를 것입니다. 그러나 Python 3.3에서는 둘 다 동일 합니다. 어느 시점에서 나는 그 스크립트를 파이썬 3으로 업데이트 할 것이다.
또 다른 해결 방법으로 PDF로 저장 한 다음 Inkscape로 해당 문서를 열 수 있습니다.
"포함 된 이미지"및 빙고를 선택 취소하면 모든 png / jpeg가 홈 디렉토리로 배출됩니다.
지저분하지만 data : URL을 다루는 것보다 빠릅니다.
@Johnny_Bit 의 PHP 스크립트를 향상시킵니다 . 스크립트의 새로운 릴리스는 svg를 새로운 행과 함께 사용할 수 있습니다. svg 파일에서 여러 이미지를 추출하여 외부 png 파일로 저장합니다. Svg 및 png 파일은 'svg'디렉토리에 있지만 상수 'SVG_DIR'에서 변경할 수 있습니다.
<?php
define ( 'SVG_DIR', 'svg/' );
define ( 'SVG_PREFIX', 'new-' );
$svgs = glob(SVG_DIR.'*.svg');
$external = array();
$img = 1;
foreach ($svgs as $svg) {
echo '<p>';
$svg_data = file_get_contents( $svg );
$svg_data = str_replace( array("\n\r","\n","\r"), "", $svg_data);
$svg_file = substr($svg, strlen(SVG_DIR) );
echo $svg_file.': '.strlen($svg_data).' ????';
if ( preg_match_all( '|<image[^>]+>|', $svg_data, $images, PREG_SET_ORDER) ) {
foreach ($images as $image_tag) {
if ( preg_match('%xlink:href="data:([a-z0-9-/]+);base64,([^"]+)"%i', $image_tag[0], $regs) ) {
echo '<br/>Embeded image has benn saved to file: ';
$type = $old_type = $regs[1];
$data = $old_data = $regs[2];
$md5 = md5($data);
if ( array_key_exists($md5, $external) ) {
$image_file = $external[$md5];
} else {
$data = str_replace(" ", "\r\n", $data);
$data = base64_decode($data);
$type = explode('/', $type);
$image_file = substr( $svg_file, 0, strlen($svg_file)-4 ) . '-' . ($img++) . '.png';
file_put_contents(SVG_DIR.$image_file, $data);
$external[$md5] = $image_file;
}
echo $image_file;
$svg_data = str_replace('xlink:href="data:'.$old_type.';base64,'.$old_data.'"', 'xlink:href="'.$image_file.'"', $svg_data);
}
}
file_put_contents(SVG_DIR.SVG_PREFIX.'.svg', $svg_data);
}
echo '</p>';
}
?>
Inkscape에서 파일을 열고 내보낼 비트 맵을 선택하십시오. 파일-> 비트 맵 내보내기 (Ctrl + Shift + E)를 클릭하면 선택한 비트 맵 만 내 보내야합니다.