SVG รองรับการฝังภาพบิตแมปหรือไม่?


147

ภาพ SVG เป็นภาพเวกเตอร์ล้วนๆหรือเราสามารถรวมภาพบิตแมปเป็นภาพ SVG ได้หรือไม่? วิธีการเกี่ยวกับการแปลงที่นำไปใช้กับภาพบิตแมป (เปอร์สเปคทีฟแมป ฯลฯ )

แก้ไข : รูปภาพอาจรวมอยู่ใน SVG โดยอ้างอิงลิงก์ ดูhttp://www.w3.org/TR/SVG/struct.html#ImageElement คำถามของฉันเป็นจริงหากภาพบิตแมปอาจรวมอยู่ใน svg เพื่อให้ภาพ svg จะมีอยู่ในตัวเอง มิฉะนั้นเมื่อใดก็ตามที่ภาพ svg ปรากฏขึ้นจะต้องมีการเชื่อมโยงและภาพที่ดาวน์โหลด Apparently .svg files เป็นเพียงไฟล์ xml

คำตอบ:


207

ใช่คุณสามารถอ้างอิงภาพใด ๆ จาก<image>องค์ประกอบ และคุณสามารถใช้data uri'sเพื่อทำให้ svg มีการควบคุมตัวเองได้อย่างเต็มที่ ตัวอย่าง:

<image width="100" height="100" xlink:href="data:image/png;base64,...">

จุดต่างๆเป็นที่ที่คุณจะเพิ่มข้อมูล base64 ที่เข้ารหัสซึ่งเป็นตัวแก้ไขกราฟิกแบบเวกเตอร์ที่สนับสนุน svg มักจะมีตัวเลือกสำหรับการบันทึกด้วยภาพที่ฝังอยู่ มิฉะนั้นจะมีเครื่องมือมากมายสำหรับการเข้ารหัสไปยังและจาก base64

นี่คือตัวอย่างเต็มรูปแบบจากการทดสอบ SVG


2
@Aleksandar เป็นคำถามแยกต่างหากและฉันแน่ใจว่าคุณสามารถหาคำตอบได้ในเว็บไซต์นี้ (การเข้ารหัสบางอย่างไปยัง base64 ไม่ใช่ svg-specific)
Erik Dahlström

1
@Erik - สมมติว่าฉันมีภาพเดียวกันซ้ำหลายพันครั้งในไฟล์ svg เดียวกัน ฉันสามารถวางข้อมูล base64 ไว้ในที่เดียวแล้วปล่อยให้รูปภาพอ้างถึงข้อมูลนั้นจากที่นั่นได้ไหม?
Rohit Vats

3
@Erik - ใจฉันไม่เคยได้คำตอบของฉันจากที่นี่ - stackoverflow.com/questions/16685014/... คำตอบพูดถึงการจัดกลุ่มที่นั่น :)
Rohit Vats

3
อย่าลืมประกาศเนมสเปซxlinkตามที่เป็นอยู่: xmlns:xlink="http://www.w3.org/1999/xlink"เบราว์เซอร์ / ผู้ดูบางรายอาจไม่เห็นภาพของคุณหากไม่มีมัน
Marc_Alx

1
FYI: ตามประสบการณ์ของฉันเบราว์เซอร์ Chrome จะแสดงภาพนี้แม้ว่าคุณจะไม่ได้ระบุwidthและheightในแท็กภาพ svg อย่างไรก็ตาม Firefox และ IE จะไม่แสดงภาพหากคุณไม่ใช้แอททริบิวเหล่านี้ ดังนั้นให้แน่ใจว่าคุณระบุพวกเขา!
Stonecrusher

23

ฉันโพสต์ซอที่นี่แสดงข้อมูลภาพระยะไกลและท้องถิ่นที่ฝังอยู่ใน SVG ภายในหน้า HTML:

http://jsfiddle.net/MxHPq/

<!DOCTYPE html>
<html>
<head>
    <title>SVG embedded bitmaps in HTML</title>
    <style>

        body{
            background-color:#999;
            color:#666;
            padding:10px;
        }

        h1{
            font-weight:normal;
            font-size:24px;
            margin-top:20px;
            color:#000;
        }

        h2{
            font-weight:normal;
            font-size:20px;
            margin-top:20px;
        }

        p{
            color:#FFF;
            }

        svg{
            margin:20px;
            display:block;
            height:100px;
        }

    </style>
</head>

<body>
    <h1>SVG embedded bitmaps in HTML</h1>
    <p>The trick appears to be ensuring the image has the correct width and height atttributes</p>

    <h2>Example 1: Embedded data</h2>
    <svg id="example1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <image x="0" y="0" width="5" height="5" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="/>
    </svg>

    <h2>Example 2: Remote image</h2>
    <svg id="example2" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <image x="0" y="0" width="275" height="95" xlink:href="http://www.google.co.uk/images/srpr/logo3w.png" />
    </svg>

    <h2>Example 3: Local image</h2>
    <svg id="example3" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <image x="0" y="0" width="136" height="23" xlink:href="/img/logo.png" />
    </svg>


</body>
</html>

17

คุณสามารถใช้Data URIเพื่อจัดหาข้อมูลรูปภาพตัวอย่างเช่น

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

<image width="20" height="20" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="/>

</svg>

ภาพจะผ่านการแปลง svg ปกติทั้งหมด

แต่เทคนิคนี้มีข้อเสียตัวอย่างเช่นรูปภาพจะไม่ถูกแคชโดยเบราว์เซอร์


ถ้าจำเป็นต้องใช้ข้อมูล URI ของ SVG นี่น่าจะเป็นข้อเสีย - ฉันจะแก้ไขคำตอบของฉัน
GarethOwen

รูปภาพที่ฝัง (ข้อมูล URI) จะถูกเก็บไว้กับเอกสารที่อยู่ในนั้นดูเช่นstackoverflow.com/questions/4791807/data-uris-and-caching
Erik Dahlström

เผง - ถ้าเอกสาร svg เปลี่ยนบิตแมปที่ฝังตัวจะถูกโหลดใหม่แม้ว่ามันจะเหมือนกันก็ตาม หากเราเชื่อมโยงไปยัง http URL สิ่งนี้สามารถแคชแยกต่างหากกับเอกสาร svg
GarethOwen

1
จุดดี. ในความคิดเห็นของฉันต่อคำตอบของ Nick คุณจะเห็นเหตุผลของการฝังรูปบิตแมปในรูป svg แม้ว่าคุณจะถูกต้องการเข้ารหัสไม่ดีและไม่มีประสิทธิภาพ มันควรจะเป็นไฟล์ที่เข้ารหัสแบบไบนารีแยกต่างหากย้ายไปพร้อมกับภาพ svg
chmike

2

คุณสามารถใช้data:URLเพื่อฝังรูปภาพที่เข้ารหัส Base64 แต่มันไม่มีประสิทธิภาพมากและไม่แนะนำให้ฝังภาพขนาดใหญ่ มีเหตุผลเชื่อมโยงไปยังไฟล์อื่นไม่ได้?


มันขึ้นอยู่กับกรณีการใช้งาน กรณีการใช้งานที่ฉันกำลังพิจารณาคือการคัดลอกไฟล์ svg และไม่สามารถใช้อินเทอร์เน็ตได้ตลอดเวลา (เช่นนามบัตร) นอกจากนี้ยังช่วยให้การใช้การ์ดส่วนตัว ด้วยภาพที่เชื่อมโยงกันเจ้าของภาพสามารถติดตามการแสดงผลการ์ดทั้งหมดซึ่งอาจน่าสนใจสำหรับเขา แต่ไม่ใช่สำหรับผู้ถือบัตร ภาพ SVG ที่บรรจุในตัวทำให้รู้สึก
chmike

เป็นเรื่องจริงถ้าคุณใช้ URL สัมบูรณ์ที่ชี้ไปยังที่ใดที่หนึ่งบนอินเทอร์เน็ต แต่มันง่ายที่จะใช้ URL สัมพัทธ์เพื่อที่ว่าหากไฟล์ SVG เป็นไฟล์ท้องถิ่นภาพก็จะเหมือนกัน หากคุณมีความต้องการที่จะต้องเป็นไฟล์ที่สามารถเผยแพร่ซ้ำไฟล์เดียวไฟล์นั้นจะเปลี่ยนสิ่งต่าง ๆ อีกครั้ง
Nick

มีกรณีการใช้งานที่คุณต้องการให้กราฟิก SVG อยู่ในตัวเองนั่นคือไฟล์หนึ่งไฟล์ที่มีภาพทั้งหมด การขนส่ง / จัดเก็บไฟล์หลาย ๆ ไฟล์เพื่อให้แน่ใจว่าการแสดงรูปภาพนั้นไม่ใช่เรื่องที่ดีเมื่อจัดการกับรูปภาพในระบบไฟล์ - สิ่งต่าง ๆ อาจหลุดหรือซิงค์ได้ง่ายเกินไป
Minok

-1

นอกจากนี้ยังเป็นไปได้ที่จะรวมบิตแมป ฉันคิดว่าคุณยังสามารถใช้การแปลงกับที่


จริง ฉันเพิ่งพบลิงค์นี้: w3.org/TR/SVG/struct.html#ImageElement น่าเสียดายที่มันไม่ตอบข้อกังวลของฉันที่ฉันสังเกตเห็นว่าไม่ได้ระบุไว้ในคำถาม ฉันจะแก้ไขคำถาม
chmike
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.