2012-06-12 11 views
6

पर छवि गैलरी के लिए छवि का आकार बदल रहा है मैं वर्तमान में ऐसी वेबसाइट पर काम कर रहा हूं जो कुछ विवरण पृष्ठों पर एक छवि गैलरी दिखाएगा। इसे छोटे थंबनेल छवियों के साथ नीचे एक नेविगेशन दिखाना चाहिए और यह प्रत्येक तत्व को कुछ बुनियादी जानकारी और बड़ी छवि के अनुसार दिखाना चाहिए।ट्रिडियन 2011

बड़ी छवि का भी आकार बदलना चाहिए, क्योंकि उनके लिए अधिकतम आकार की अनुमति है।

बिंदु प्रति मल्टीमीडिया घटक केवल एक स्रोत छवि का उपयोग करना है और प्रकाशन समय पर छवियों का आकार बदलने में सक्षम होना है, इसलिए स्रोत छवि से क्लाइंट ब्राउज़र को थंबनेल और एक बड़ी छवि भेजी जाएगी। शैलियों या एचटीएमएल का उपयोग करके छोटी और बड़ी छवियां दिखाना संभव है, लेकिन यह काफी अनुपयोगी है क्योंकि स्रोत (उनमें से कुछ वास्तव में भारी) छवि हमेशा ग्राहक को भेजी जाती है।

मेरा पहला विचार कस्टम कोड खंड था, कुछ सी # में लिखा गया था, लेकिन मुझे केवल कुछ छवियों को एक निश्चित आकार में आकार देने के लिए जटिल लगता है और फिर उन्हें फिर से दूसरे आकार में बदल देता है। मुझे एसआरसी को अंतिम एचटीएमएल पर एप्राइपिएट पथ के साथ बदलने का तरीका नहीं मिला है।

एक और विचार एक पुरानी शैली PublishBinary विधि बनाने के लिए था, लेकिन मैं यह वास्तव में जटिल लगता है क्योंकि वर्तमान Tridion वास्तुकला की तरह दिखता है सब पर ऐसा करने के लिए नहीं है ...

और सबसे महत्वपूर्ण बात, यहां तक ​​कि अगर हम सफलतापूर्वक आकार बदल सकते हैं (किसी भी तरह) यह वर्तमान में एक ही छवि को दो बार प्रकाशित करने के लिए एक ट्रिडियन 2011 मुद्दा है। बड़े और छोटे संस्करण दोनों वास्तव में एक ही मल्टीमीडिया घटक से आएंगे, इसलिए दोनों को प्रकाशित करना या नामों के साथ खेलना संभव नहीं होगा, पहला वाला हमेशा समाप्त हो जाएगा, क्योंकि पथ दूसरे के साथ अपडेट किया जाएगा : एस।

कोई विचार?

+0

आप बाहर का को देखा है -इ-बॉक्स "छवि का आकार बदलें" टेम्पलेट बिल्डिंग ब्लॉक? यह निर्दिष्ट आयामों के साथ एमएम घटकों के रूपों को बनाता है, ऐसा लगता है कि आपको वही चाहिए जो आपको चाहिए ... और 2008 के बाद से ट्रिडियन है ... –

+1

ग्रेट सवाल @glezalex - यदि आप एसडीएल ट्रिडियन के साथ अधिक शामिल होने में रुचि रखते हैं समुदाय, कृपया अपने स्टैक ओवरफ़्लो लॉगिन का उपयोग करके http://area51.stackexchange.com/proposals/38335/tridion?referrer=eo63snjNlUWNn9xqeeO2NA2 पर एसडीएल ट्रिडियन प्रस्ताव पर विचार करने पर विचार करें ताकि आपके खाते जुड़े हुए हों। –

उत्तर

10

मैंने अतीत में एक छवि पुन: आकार देने वाली टीबीबी बनाई है जो ड्रीमवेवर या एक्सएसएलटी टेम्पलेट के आउटपुट को पढ़ता है। विचार पहले टेम्पलेट के साथ निम्न जैसे टैग का उत्पादन करना है।

<img src="tcm:1-123" maxWidth="250" maxHeight="400" 
    cropPosition="middle" variantId="250x400" 
    action="PostProcess" enlargeIfTooSmall="true" 
/> 

"पुनः आकार" TBB फिर पोस्ट आउटपुट आइटम पैकेज में संसाधित करता है, postprocess कार्रवाई के साथ नोड्स की तलाश में।

यह तो maxHieght और maxWidth आयाम विशेषताओं के अनुसार System.Drawing लाइब्रेरी का उपयोग कर मल्टीमीडिया घटक का एक प्रकार बनाता है, और यह AddBinary() विधि @frank उल्लेख का उपयोग कर और एक फ़ाइल नाम उपसर्ग के लिए variantId विशेषता का उपयोग, और संस्करण आईडी प्रकाशित करता है (और नई बाइनरी के यूआरएल के साथ एसआरसी विशेषता को बदल देता है)।

इस 100% लचीला बनाने के लिए, अगर maxHeight या maxWidth किसी भी विशेषता का 0 की तैयारी में हैं, TBB फिर से आकार बस "गैर शून्य" आयाम के आधार पर, या यदि दोनों सेट कर रहे हैं यह आधारित छवि फसलों फसल पर विशेषता विशेषता। यह हमें उन्हें विकृत किए बिना दोनों परिदृश्य और चित्र छवियों के लिए वर्ग थंबनेल बनाने में सक्षम बनाता है। enlargeIfTooSmall विशेषता छोटी छवियों को अधिक से अधिक होने से रोकने के लिए उपयोग की जाती है।

आप अंतिम दीर्घाओं यहाँ के नमूने देख सकते हैं: http://medicine.yale.edu/web/help/examples/specific/photo/index.aspx

और अन्य छवि फिर से sizeing यहाँ उदाहरण: http://medicine.yale.edu/web/help/examples/general/images.aspx

छवियों के सभी बस एक बार सीएमएस अपलोड किए जाते हैं, और उसके बाद फिर से प्रकाशित समय पर फ्लाई पर आकार और फसल।

6

ट्रिडियन एक एमएमसी पर कई प्रकारों को पूरी तरह से अच्छी तरह से प्रकाशित कर सकता है। जब आप AddBinary पर कॉल करते हैं तो आप निर्दिष्ट कर सकते हैं कि यह बाइनरी एमएमसी का एक रूप है, प्रत्येक संस्करण को आपके द्वारा निर्दिष्ट एक सरल स्ट्रिंग द्वारा पहचाना जा रहा है।

public Binary AddBinary(
    Stream content, 
    string filename, 
    StructureGroup location, 
    string variantId, 
    Component relatedComponent, 
    string mimeType 
) 

क्या आप भी द्विआधारी के लिए फ़ाइल नाम निर्दिष्ट कर सकते हैं देख सकते हैं। यदि आप करते हैं, तो यह आपकी ज़िम्मेदारी है कि विभिन्न एमएमसी के बीच भिन्न फ़ाइल नाम और फ़ाइल नाम अद्वितीय हैं। तो आम तौर पर, vientId: <MmcImageFileName>_thumbnail.jpg के कुछ संकेतों के साथ फ़ाइल नाम को उपसर्ग या प्रत्यय करना सबसे आसान है।

5

हाल ही में डेमो प्रोजेक्ट के लिए, मैंने एक पूरी तरह से अलग दृष्टिकोण लिया। द्विआधारी सभी ब्रोकर डेटाबेस में प्रकाशित हैं। उन्हें ब्रोकर से एचटीपी मॉड्यूल के साथ निकाला जाता है, जो फाइल सिस्टम में द्विआधारी डेटा लिखता है। मैंने छवि के यूआरएल में वांछित चौड़ाई या ऊंचाई को एन्कोड करना संभव बना दिया है (बेशक, उन बाइनरी के लिए जो तर्क नहीं हैं इस तर्क के इस भाग में काम नहीं करेगा)। मॉड्यूल फिर फ्लाई पर छवि का आकार बदलता है (वास्तव में फ्लाई पर, प्रकाशन के दौरान नहीं!) और डिस्क में आकार का संस्करण लिखता है।

उदाहरण के लिए: यदि मैं /Images/photo.jpg का अनुरोध करता हूं, तो मुझे मूल छवि मिल जाएगी। अगर मैं/images/photo_h100.jpg का अनुरोध करता हूं, तो मुझे 100 पिक्सल का संस्करण मिलता है। Url /Images/photo_w150.jpg 150 पिक्सेल की चौड़ाई की ओर जाता है।

किसी भी प्रकार की आवश्यकता नहीं है, अलग-अलग आकार की आवश्यकताओं के कारण कोई पुन: प्रकाशित नहीं है: आकार बदलने पर पूरी तरह से किया जा रहा है! सर्वर पर प्रदर्शन जुर्माना नगण्य है: प्रत्येक आकार केवल एक बार उत्पन्न होता है, जब तक कि छवि को पुन: प्रकाशित नहीं किया जाता है।

मैंने .NET का उपयोग किया, लेकिन निश्चित रूप से यह जावा में भी काम कर सकता है।

4

फ्रैंक और क्विरिजन के उत्तर के बाद आप परिवेश डेटा फ्रेमवर्क का उपयोग कर कार्ट्रिज दावे प्रोसेसर में छवि का आकार बदलने पर रुचि ले सकते हैं। यह समाधान प्रौद्योगिकी अज्ञेयवादी होगा और जावा और नेट दोनों में फिर से उपयोग किया जा सकता है। आपको बस आकार में आकार के बाइट्स को दावे में रखना होगा और फिर जावा या नेट में इसका इस्तेमाल करना होगा।

जावा दावा प्रोसेसर:

public void onRequestStart(ClaimStore claims) throws AmbientDataException { 
    int publicationId = getPublicationId(); 
    int binaryId = getBinaryId(); 

    BinaryContentDAO bcDAO = (BinaryContentDAO)StorageManagerFactory.getDAO(publicationId, StorageTypeMapping.BINARY_CONTENT); 
    BinaryContent binaryContent = bcDAO.findByPrimaryKey(publicationId, binaryId, null); 

    byte[] binaryBuff = binaryContent.getContent(); 
    pixelRatio = getPixelRatio(); 

    int resizeWidth = getResizeWidth(); 

    BufferedImage original = ImageIO.read(new ByteArrayInputStream(binaryBuff)); 
    if (original.getWidth() < MAX_IMAGE_WIDTH) { 
     float ratio = (resizeWidth * 1.0f)/(float)MAX_IMAGE_WIDTH; 

     float width = original.getWidth() * ratio; 
     float height = original.getHeight() * ratio; 

     BufferedImage resized = new BufferedImage(Math.round(width), Math.round(height), original.getType()); 
     Graphics2D g = resized.createGraphics(); 
     g.setComposite(AlphaComposite.Src); 

     g.drawImage(original, 0, 0, resized.getWidth(), resized.getHeight(), null); 
     g.dispose(); 

     ByteArrayOutputStream output = new ByteArrayOutputStream(); 

     BinaryMeta meta = new BinaryMetaFactory().getMeta(String.format("tcm:%s-%s", publicationId, binaryId)); 
     String suffix = meta.getPath().substring(meta.getPath().lastIndexOf('.') + 1); 

     ImageIO.write(resized, suffix, output); 
     binaryBuff = output.toByteArray(); 
    } 
    claims.put(new URI("taf:extensions:claim:resizedimage"), binaryBuff); 
} 

नेट HTTP हैंडलर:

public void ProcessRequest(HttpContext context) { 
    if (context != null) { 
     HttpResponse httpResponse = HttpContext.Current.Response; 

     ClaimStore claims = AmbientDataContext.CurrentClaimStore; 
     if (claims != null) { 
      Codemesh.JuggerNET.byteArray javaArray = claims.Get<Codemesh.JuggerNET.byteArray>("taf:extensions:claim:resizedimage"); 
      byte[] resizedImage = javaArray.ToNative(javaArray); 
      if (resizedImage != null && resizedImage.Length > 0) { 
       httpResponse.Expires = -1; 
       httpResponse.Flush(); 
       httpResponse.BinaryWrite(resizedImage); 
      } 
     } 
    } 
} 

जावा फिल्टर:

@Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  
     ClaimStore claims = AmbientDataContext.getCurrentClaimStore(); 
     if (claims != null) { 
      Object resizedImage = claims.get(new URI("taf:extensions:claim:resizedimage")); 
      if (resizedImage != null) { 
       byte[] binaryBuff = (byte[])resizedImage; 
       response.getOutputStream().write(binaryBuff); 
      } 
     } 
    } 
संबंधित मुद्दे