2010-06-02 18 views
5

मैं पाइथन rsvg बाइंडिंग का उपयोग कैरो में एक एसवीजी छवि प्रस्तुत करने और फ़ाइल में सहेजने के लिए करता हूं, जो ज्यादातर काम करता है। लेकिन अगर एसवीजी फ़ाइल एक लिंक छवि है, तो तरह शामिल हैं:rsvg लिंक की गई छवियों को प्रस्तुत नहीं करता

<image href="static/usrimgs/tmpDtIKpx.png" x="10" y="10" width="600px" height="400px"></image> 

छवि अंतिम फ़ाइल में दिखाई नहीं करता है (svg के बाकी ठीक renders)। रिश्तेदार पथ सही है कि स्क्रिप्ट चल रहा है, इस पर आधारित है, लेकिन मुझे लगता है कि इस तथ्य के साथ कुछ समस्या है कि यह आमतौर पर एक सापेक्ष यूआरएल होगा, न कि एक रिश्तेदार फ़ाइलपैथ। मैं इसके आसपास कैसे पहुंचू?

+0

मुझे एक ही समस्या है। एक अवैध url href (एक फ़ाइल से लिंक जो मौजूद नहीं है) को बताता है कि आरएसवीजी फ़ाइल को नहीं ढूंढ पा रहा है तो त्रुटि उत्पन्न नहीं करेगा। – molecular

उत्तर

2

उत्तर file:/// से शुरू होने के लिए लिंक को संसाधित करना था और पूर्ण पूर्ण पथ होना था।

+1

ने मेरे लिए मदद नहीं की :(। यह एक ही मशीन पर एक ही लाइब्रसव्यू संस्करण के साथ काम करता है। इस आर्टलिनक्स मशीन पर नहीं। हालांकि, संकलित आरएसवीजी-खुद को रूपांतरित करें .. मदद नहीं की। – molecular

+0

वही समस्या (ओएसएक्स 10.9 का उपयोग करके) – tobinharris

2

ऐसा लगता है कि, यदि आप जिस फ़ाइल को शामिल कर रहे हैं वह उसी पथ पर नहीं है या उस एसवीजी फ़ाइल के पथ के नीचे है जिसे आप कनवर्ट करना चाहते हैं, तो उसे यह नहीं मिलेगा। मैं इसे एक बग के रूप में मानता हूं।

+0

मुझे लगता है कि एक 'सुरक्षा सुविधा'। मैंने स्रोत को देखा और इसे पुन: संकुचित करने से कम करने का कोई तरीका नहीं है। बस एक नोट है कि यह उबंटू 10.04 पर काम करता था, लेकिन 12.04 को यह 'फीचर' जोड़ा गया था। –

11

ऐसे कई कारक हैं जिन्हें किसी छवि संसाधन को लोड करने की अनुमति देने के लिए LibRsvg से संतुष्ट होना चाहिए। v2.40 के रूप में इन में शामिल हैं:

  • छवि एक xlink:href विशेषता
  • होना आवश्यक है कि विशेषता शामिल होना चाहिए एक पूर्ण, वैध यूआरआई
  • योजना हो सकता है data:// या file://
  • file:// पथ होना चाहिए पूर्ण
  • file:// पथ एसवीजी स्रोत फ़ाइल के पथ में या नीचे होना चाहिए (किसी भी सिम्लिंक को संदर्भित किए जाने के बाद)

ध्यान दें कि यदि इनपुट rsvg-convert पर stdin के माध्यम से पास किया गया है, तो इनपुट पथ की उपनिर्देशिका के रूप में कोई पथ गिनती नहीं है और सभी file:// छवियों से इनकार कर दिया जाएगा।

rsvg-convert <input.svg> output.png # images denied 

rsvg-convert -o output.png input.svg # images allowed 

कोड शासी चित्र URL संकल्प rsvg-base.c में LibRsvg source में पाया जा सकता, समारोह _rsvg_handle_allow_load

rsvg-परिवर्तित करने के लिए एक डिबगिंग अधिसूचना को जोड़ने के लिए जब छवि लोड हो रहा है विफल रहता है, एक स्रोत में

#define G_ENABLE_DEBUG 
config.h को

संलग्न करें और पुन: संयोजित कर सकते हैं।

2

मैं एसवीजी प्रतिपादन को गति देने के लिए अपने मैक पर काम कर रहे librsvg छवि प्रतिपादन प्राप्त करना चाहता था। इयान मैकिनॉन के महान जवाब में सभी अवयव हैं लेकिन लाइब्रेरी में बदलाव को लागू करना मुश्किल है। इन चरणों ने librsvg को संबंधित पथों के साथ लिंक की गई छवियों को सही ढंग से प्रस्तुत किया है। मुझे आशा है कि यह किसी को कुछ समय बचाएगा।

पहले, मैं का उपयोग कर librsvg स्थापित:

brew install --build-from-source librsvg 

लेखन के समय, इस संस्करण 2.40.13 को स्थापित करता है और आवश्यक पुस्तकालयों इसे बनाने की।मैं तो डाउनलोड किया है और मेरे घर निर्देशिका में स्रोत संग्रह निकाले:

wget https://download.gnome.org/sources/librsvg/2.40/librsvg-2.40.13.tar.xz 
tar jxvf librsvg-2.40.13.tar.xz 
cd librsvg-2.40.13 

मैं इस निर्देशिका में rsvg-base.c में _rsvg_handle_allow_load समारोह संपादित लाइन 2275 के आसपास इस कोड को जोड़कर पथ लोड हो रहा है प्रतिबंध बायपास करने के लिए:

2275 
2276  goto allow; // Just try and load it! 
2277  

मैं भी rsvg-image.c में rsvg_cairo_surface_new_from_href समारोह संपादित करें और इसे माइम प्रकार का उपयोग कर लोड हो रहा है को रोकने के लिए की जरूरत - सिर्फ इस तरह समारोह की जगह:

55  if (mime_type) { 
56   // loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, error);  // This doesn't work on my mac 
57   loader = gdk_pixbuf_loader_new(); // This works 
58  } else { 
59   loader = gdk_pixbuf_loader_new(); 
60  } 

मैं संकलन और संशोधित पुस्तकालय स्थापित करने के लिए इन थोड़ा संशोधित आदेशों का उपयोग करने की जरूरत:

make clean 
make install gdk_pixbuf_binarydir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders gdk_pixbuf_moduledir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders 

आपके सिस्टम के आधार पर आप ऊपर बताए गए आदेशों को sudo जोड़ने की जरूरत हो सकती है।

एक बार ऐसा हो गया था, मैं rsvg-convert कमांड लाइन उपकरण है जो librsvg साथ स्थापित किया गया है का उपयोग कर रिश्तेदार एसवीजी लिंक प्रस्तुत करना सकता है:

rsvg-convert test.svg -o test.png 

मैं भी ImageMagick उपयोग करना पीएनजी के सापेक्ष छवि लिंक के साथ SVGs कन्वर्ट करने के लिए कर रहा था फ़ाइलों अगर मैं इसे इस तरह से librsvg स्थापित करने के बाद स्थापित:

convert test.svg test.png 

यह आपको rsvg समारोह और प्रदर्शन का परीक्षण करते हैं जाएगा - मैंने पाया यह 2-3x इंकस्केप की तुलना में तेजी अपने आवेदन के लिए किया गया था। यदि आप उत्पादन वातावरण में इसका उपयोग करते हैं तो मैं कोड को और समझदारी से बदलने की सलाह देता हूं।

संबंधित मुद्दे