কীভাবে একটি এসভিজি ফাইল থেকে এম্বেড করা চিত্রটি বের করা যায়?


26

আমার একটি এসভিজি ফাইল রয়েছে যাতে অন্তত একটি এমপিডেড জেপিজি / পিএনজি চিত্র থাকে। আমি সেই এসভিজি ফাইল থেকে জেপিজি / পিএনজি চিত্রগুলি বের করতে এবং ডিস্কে সেভ করতে চাই।

inkscapeএসভিজি ফাইলগুলি সম্পাদনা করার জন্য আমি যে প্রোগ্রামটি ব্যবহার করি সেভাবেই আমি ট্যাগটি যুক্ত করছি তবে আমি অন্যান্য সরঞ্জামগুলি ব্যবহার করে সমাধানও গ্রহণ করি।


1
অন্য কিছু না হলে পাইথন সম্ভবত কিছু কাস্টম আঠালো এটি lxML এবং পিআইএল (বা সমতুল্য) ব্যবহার করে করতে পারত।
কিথ

@ কীথ, সত্যই, আমি এই প্রশ্নটি সমাধান করার জন্য একটি পাইথন স্ক্রিপ্ট লিখেছি । এটি অন্তর্নির্মিত xml.etreeলাইব্রেরি ব্যবহার করে ।
ডেনিলসন সা মাইয়া

উত্তর:


30

আমার নিজস্ব সমাধান (বা ... কার্যতঃ):

  1. ইঙ্কস্কেপে চিত্রটি নির্বাচন করুন
  2. অন্তর্নির্মিত XML Editor( Shift+ Ctrl+ X) খুলুন
  3. xlink:hrefবৈশিষ্ট্যটি নির্বাচন করুন , যা চিত্র হিসাবে ডেটা হিসাবে থাকবে : ইউআরআই
  4. পুরো data:ইউআরআই অনুলিপি করুন
  5. data:ব্রাউজারে সেই ইউআরআই আটকান এবং সেখান থেকে এটি সংরক্ষণ করুন।

বিকল্পভাবে, আমি যে কোনও পাঠ্য সম্পাদকে এসভিজি ফাইলটি খুলতে, data:ইউআরআই সনাক্ত করতে এবং সেখান থেকে এটি অনুলিপি করতে পারি।

যদিও এই সমাধানটি কাজ করে, তবে এটি জটিল। এবং আমি আরও ভাল কিছু শিখতে চাই love


2
+1 - আমি এই পদ্ধতিটি ব্যবহার করে একটি 3.5 এমবি চিত্র রফতানি করেছি যা কিছুক্ষণ সময় নিয়েছে তবে কাজ করেছে। কোনওভাবেই "এক্সট্রাক্ট ইমেজ" ফাংশনটি আমার পক্ষে কার্যকর হয়নি।
মার্টিন


17

পরিবর্তে এর চেয়ে আরও ভাল সমাধান রয়েছে:

সেখানে যান Extensions -> Images -> Extract Image..., আপনি ফাইল হিসাবে নির্বাচিত রাস্টার চিত্র সংরক্ষণ করতে পারেন। তবে এই এক্সটেনশনটি অদ্ভুতভাবে কাজ করে এবং কোনওভাবে বরং ধীরে ধীরে কাজ করে (তবে পুরোপুরি ভাল)।

অন্য দ্রষ্টব্য: এই এক্সটেনশনটি জটিল and এবং বিভিন্ন বৃহত চিত্রগুলিতে নিঃশব্দে মারা যায়। এছাড়াও, প্রচুর পরিমাণে রাস্টার চিত্রের সাহায্যে এটি ইনসক্যাপের মেমরির ব্যবহারকে ভয়াবহ আকারে বাড়িয়ে তুলতে পারে (কেবলমাত্র কয়েক মুঠো ছবি তোলার পরে 3 জিবি)।

যেহেতু আমি প্রায় 20 টি এসজিজি ফাইল পেয়েছি যার মধ্যে প্রায় 70 টি রাস্টার ইমেজ রয়েছে, প্রতিটি চিত্র কমপক্ষে 1 এমবি আকারের, আমার আলাদা সমাধান দরকার। ডেনিলসন সা টিপ ব্যবহার করে একটি সংক্ষিপ্ত চেক করার পরে আমি নিম্নলিখিত পিএইচপি স্ক্রিপ্টটি তৈরি করেছি, এটি এসভিজি ফাইলগুলি থেকে চিত্রগুলি বের করে:

#!/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);

এইভাবে আমি চাইলে সমস্ত চিত্র পেতে পারি এবং এমডি 5 বারবার চিত্র পাওয়া থেকে আমাকে বাঁচায়।

আমি বাজি ধরছি এমন আরও একটি উপায় অবশ্যই থাকতে হবে যা অনেক সহজ, তবে এটি আরও ভাল করে চালানোর জন্য এটি ইনস্কেপ ডিভস এর উপর নির্ভর করে।


দ্রষ্টব্য: আপনার স্ক্রিপ্টটি data:প্রতি লাইন প্রতি একক ইউআরএল সমর্থন করে এবং href অ্যাট্রিবিউটের ভিতরে নিউলাইনগুলিকে সমর্থন করে না (ইনস্কেপ এগুলি ডেটা ইউআরএলগুলির জন্য যুক্ত করে, এবং বেস 64 স্পেস এমনকি নির্দেশ দেয় যে লাইনগুলি chars অক্ষরের বেশি হওয়া উচিত নয় )। দ্রুত হ্যাক করার জন্য দুর্দান্ত স্ক্রিপ্ট, তবে এটি সব ধরণের এসভিজির সাথে কাজ করে না।
ডেনিলসন সা মিয়া

ফাইলের সদৃশতা রোধ করতে এমডি 5 যোগ করার জন্য @ জননি_বিট +1। আমি আপনার স্ক্রিপ্টটি imrove নিচে
ইভান জেড

ভাল, মার্চ 2019 এবং যুক্তিসঙ্গত বড় ইমেজ সহ সহজ গ্র্যান্ড কাজ করেছেন। এবং বেশ পুরানো ল্যাপটপ / উবুন্টু / ইনস্কেপ 0.48.4। ধন্যবাদ!
গাইথা

9

অবশেষে, বছর পরে, আমি এসভিজি কোডটি বিশ্লেষণের জন্য একটি উপযুক্ত এক্সএমএল লাইব্রেরি ব্যবহার করে একটি এসভিজি ফাইল থেকে সমস্ত চিত্র সঠিকভাবে বের করতে একটি স্ক্রিপ্ট লিখেছি written

http://bitbucket.org/denilsonsa/small_scripts/src/tip/extract_embedded_images_from_svg.py

এই স্ক্রিপ্টটি পাইথন ২.7 এর জন্য রচিত কিন্তু পাইথন ৩ তে রূপান্তর করা বেশ সহজ হওয়া উচিত Even এমনকি আরও ভাল, সংস্করণে নতুন নতুন বৈশিষ্ট্যের কারণে পাইথন ৩.৪ রূপান্তর করার পরে প্রায় 50 টি লাইন মুছে ফেলা যায়।


ধন্যবাদ, যেহেতু এটি কাজ করে। তবে এটি পিডিএফ ওয়ার্কারআউন্ডের চেয়ে অনেক ধীর। আপনি কি সমান্তরাল প্রক্রিয়াজাতকরণ সম্পর্কে চিন্তা করেছেন? এখনই স্ক্রিপ্টটি কেবল একটি সিপিইউ / কোর / থ্রেড ব্যবহার করে।
ড্যানম্যান

@ ড্যানমন দুর্ভাগ্যক্রমে, এটিকে সমান্তরাল করা কোনও কিছুর গতি বাড়ানোর ম্যাজিক সমাধান নয়। বাধাটি সনাক্ত করার জন্য আমার কোডটি প্রোফাইল করা দরকার need যদি বাধাটি এক্সএমএল পার্সিং হয় তবে আমি দুঃখিত, part অংশটি সমান্তরালে করা যায় না। আপনি কি দয়া করে আমাকে ই-মেইলে প্রেরণ করতে পারেন যে সঠিক এসভিজি ফাইলগুলি খুব ধীর? যখনই আমার কিছু সময় আছে, আমি পারফরম্যান্সটি তদন্ত করতে পারি।
ডেনিলসন সা মায়া

হ্যাঁ, আমি নিজেই এটি চেষ্টা করে দেখেছি এবং এটি প্রমাণিত হয়েছে যে এক্সএমএল বিশ্লেষণটি ধীর অংশ, চিত্রগুলি ডিকোডিং নয়। বলেছিল, cElementTreeদ্রুত হওয়ার কথা। তবে সম্ভবত স্যাকসের মতো আরও কিছু ভাল কাজ করে।
ড্যানমান

@ ড্যানম্যান cElementTreeসম্ভবত দ্রুততর। তবে পাইথন ৩.৩-এ উভয়ই একই রকম । এক পর্যায়ে আমি সম্ভবত স্ক্রিপ্টটি পাইথন 3 এ আপডেট করব
ডেনিলসন সা মায়া

5

এখনও অন্য কাজ হিসাবে আপনি পিডিএফ হিসাবে সংরক্ষণ করতে পারেন, তারপরে ইনকস্কেপ দিয়ে সেই দস্তাবেজটি খুলুন।

"এম্বেড ইমেজগুলি" এবং বিঙ্গোটি আনচেক করুন, সমস্ত pngs / jpegs আপনার হোম ডিরেক্টরিতে দেখানো হবে।

অগোছালো, তবে ডেটা নিয়ে বোকামি করার চেয়ে দ্রুত: ইউআরএল।


আপনি "এম্বেড ইমেজ" বিকল্পটি কোথায় পেয়েছেন?
mik01aj

1
আপনি যখন পিএসএফ ডকুমেন্টটিকে ইনস্কেপে খুলবেন, এটি পরবর্তী ডায়লগটিতে রয়েছে।
নিকোলাস উইলসন

আমার একটি পিডিএফ ছিল যা থেকে আমি ইঙ্কস্কেপে আমদানি করে একটি চিত্র বের করার চেষ্টা করেছি। সেক্ষেত্রে, এই কাজ করতে সক্ষম হচ্ছে উপর আমদানি বদলে পর আমদানি আরও বেশি উপকারে আসে।
ব্যবহারকারী 149408

আমি নিশ্চিত নই তবে এইভাবে এম্বেড করা কোনও আইসিসি প্রোফাইলগুলি প্রক্রিয়াটিতে হারিয়ে গেছে বলে মনে হয়। পাইথন স্ক্রিপ্টের মাধ্যমে আমি সরাসরি এসভিজি থেকে উত্তোলিত চিত্রগুলিতে আইসিসি প্রোফাইল এমবেড করা আছে।
ড্যানমন

1

আমি @ জননি_বিটের পিএইচপি-স্ক্রিপ্টকে উন্নত করছি । স্ক্রিপ্টের নতুন প্রকাশটি নতুন লাইনের সাথে এসভিজি ব্যবহার করতে পারে। এটি একাধিক চিত্রগুলি এসএমজি ফাইল গঠন করে এবং তাদের বহিরাগত পিএনজি ফাইলে সংরক্ষণ করে। এসভিজি এবং পিএনজি ফাইলগুলি 'এসভিজি' ডিরেক্টরিতে রয়েছে তবে আপনি এটিকে ধ্রুবক 'এসভিজি_ডিআইআর' এ পরিবর্তন করতে পারেন।

<?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>';
}

?>

0

Inkscape এ আপনার ফাইলটি খুলুন এবং আপনি যে বিটম্যাপটি রফতানি করতে চান তা নির্বাচন করুন। ফাইল-> বিটম্যাপ রফতানি করুন (সিটিআরএল + শিফট + ই) ক্লিক করুন এবং এটি কেবলমাত্র নির্বাচিত বিটম্যাপটি রফতানি করবে।


আমি এই সমাধানটি পছন্দ করি না কারণ এটি চিত্রটিকে পুনরায় এনকোড করবে। আমি এমন একটি সমাধান পছন্দ করব যা চিত্রটিকে তার আসল বিন্যাসে উত্তোলন করবে।
ডেনিলসন সা মিয়া

1
হ্যাঁ, মনে হচ্ছে ইঙ্কস্কেপটি চিত্রটিকে পুনরায় এনকোড করেছে তবে এটি পিএনজি চিত্রগুলি ডিফল্টরূপে সংরক্ষণ করে। সুতরাং আমি ধরে নিচ্ছি যে রি-এনকোডিং কমপক্ষে ক্ষতিহীন।
ক্রিস

1
সত্যিই ভাল না. এম্বেড থাকা চিত্রটির রূপান্তরগুলি থাকতে পারে (স্কেলিং, রোটেশন…), ক্লিপড থাকতে পারে বা এমন কিছুর পরেও আমি অবগত নই। এই সমস্ত রূপান্তর প্রয়োগের পরে ইঙ্কস্কেপ অবশ্যই নির্বাচিত বস্তুটি রফতানি করবে, যার অর্থ এই সমাধানটি একেবারে ক্ষতিহীন নয়।
ডেনিলসন সা মিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.