2011-07-26 9 views
10

पहले मुझे लगता है कि प्रश्न करने के लिए नेतृत्व की स्थिति/आवश्यकताओं को समझाने के लिए करना चाहते हैं:शुद्ध जावा विकल्प

हमारी वेब आवेदन हम सीएमवाइके छवियों का समर्थन नहीं कर सकते हैं (JPEG) में आईई के बाद से 8 और नीचे उन्हें प्रदर्शित नहीं कर सकते हैं। इस प्रकार हमें यह पता लगाने की आवश्यकता है कि जब कोई ऐसी छवि अपलोड करना चाहता है और उसे अस्वीकार कर देता है।

दुर्भाग्यवश, जावा का इमेजियो उन छवियों को नहीं पढ़ेगा या मुझे पता लगाया गया रंग स्थान प्राप्त करने में सक्षम नहीं होगा। डीबगिंग से ऐसा लगता है कि JPEGImageReader आंतरिक रूप से कलर स्पेस कोड 11 प्राप्त करता है (जिसका मतलब JCS_YCCK होगा) लेकिन मैं सुरक्षित रूप से उस जानकारी तक नहीं पहुंच सकता।

छवि प्रकारों के लिए पाठक से पूछताछ करते समय मुझे सीएमवाईके के लिए कुछ भी नहीं मिलता है, इसलिए मैं no image types = unsupported image मान सकता हूं।

मैंने स्रोत सीएमवाईके छवि को एक इमेजिंग टूल का उपयोग करके आरजीबी में परिवर्तित करने के लिए यह जांचने के लिए परिवर्तित किया कि यह तब पठनीय होगा (मैंने संदेश प्राप्त करते समय व्यवस्थापक के चरणों को अनुकरण करने की कोशिश की "कोई सीएमवाईके समर्थित नहीं है")। हालांकि, JPEGImageReader उस छवि को नहीं पढ़ेगा, क्योंकि यह मानता है (स्रोत में टिप्पणी!) 3-घटक आरजीबी रंग स्थान लेकिन छवि शीर्षलेख 4 घटक (शायद आरजीबीए या एआरबीबी) रिपोर्ट करता है और इस प्रकार IllegalArgumentException फेंक दिया जाता है।

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

यह मैं नेतृत्व जय ImageIO जिसका CLibJPEGImageReader एक उत्कृष्ट काम करता है और सही ढंग से मेरे सारे परीक्षण छवियों पढ़ता कोशिश करने के लिए।

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

यह प्रश्न के लिए स्पष्टीकरण है, और यहां यह फिर से आता है: क्या जैई इमेजियो के लिए कोई शुद्ध जावा विकल्प है जो विश्वसनीय रूप से सीएमवाईके छवियों का पता लगाता है और संभवतः परिवर्तित करता है?

अग्रिम धन्यवाद,

थॉमस

उत्तर

10

मुझे एक समाधान मिला जो हमारी आवश्यकताओं के लिए ठीक है: Apache Commons Sanselan। यह लाइब्रेरी जेपीईजी शीर्षलेखों को काफी तेज़ और सटीक (कम से कम मेरी सभी टेस्ट छवियों) के साथ-साथ कई अन्य छवि प्रारूपों को भी पढ़ती है।

नकारात्मकता यह है कि यह जेपीईजी छवि डेटा नहीं पढ़ेगा, लेकिन मैं मूल जेआरई उपकरणों के साथ ऐसा कर सकता हूं।

रूपांतरण के लिए पढ़ना JPEG चित्रों काफी आसान (जो कि ImageIO पढ़ने के लिए मना कर दिया, भी) है:

JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(new File(pFilename))); 
BufferedImage sourceImg = decoder.decodeAsBufferedImage(); 

फिर अगर Sanselan मुझसे कहता छवि वास्तव में सीएमवाईके है, मैं स्रोत छवि के रेखापुंज हो और परिवर्तित स्वयं:

for(/*each pixel in the raster, which is represented as int[4]*/) 
{ 
    double k = pixel[3]/255.0; 

    double r = (255.0 - pixel[0])*k; 
    double g = (255.0 - pixel[1])*k; 
    double b = (255.0 - pixel[2])*k; 
} 

यह आरजीबी छवियों में बहुत अच्छे परिणाम देता है जो बहुत उज्ज्वल या अंधेरा नहीं होता है। हालांकि, मुझे यकीन नहीं है कि k के साथ गुणा क्यों चमकती है। जेपीईजी वास्तव में मूल कोड में डीकोड किया गया है और सीएमवाईके-> आरजीबी रूपांतरण मुझे कुछ अलग राज्य मिला है, मैंने दृश्य परिणाम देखने के लिए गुणा करने की कोशिश की है।

यदि कोई इस पर कुछ प्रकाश डाल सकता है, तो मैं आभारी रहूंगा।

+0

मैंने जेएआई और सीएमवाईके जेपीईजी छवियों के साथ एक ही समस्या को मारा। क्या आप पहले से ही उत्पादन में उस दृष्टिकोण का उपयोग करते हैं? आपका अनुभव कैसा है? मुझे लगता है कि आप 'Sanselan.getImageInfo (...) का उपयोग करते हैं। GetColorType() == ImageInfo.COLOR_TYPE_CMYK' ([ImageInfo] (http://commons.apache.org/sanselan/api-release/org/apache/sanselan /ImageInfo.html)) यह जांचने के लिए कि क्या यह एक सीएमवाईके छवि है, है ना? –

+0

@bene हां, हम पहली बार जांच कर रहे हैं कि संसद को आईसीसी प्रोफाइल मिला है और यदि ऐसा है तो इसका रंग स्थान टाइप करें, लेकिन यदि यह विफल हो जाता है तो हम 'ImageInfo.getColorType()' का उपयोग करते हैं। हम इसे उत्पादन में उपयोग कर रहे हैं और अब तक कोई समस्या नहीं है, हालांकि, मुझे यह स्वीकार करना होगा कि वर्तमान में हम कई छवियों को संभाल नहीं रहे हैं। भविष्य में हमारे पास अपना खुद का मीडिया डेटाबेस होगा जो हजारों छवियों को संभालेगा और फिर उस दृष्टिकोण के उत्पादन की तैयारी पर हमें और अधिक विश्वसनीय जानकारी होगी। सिर्फ एक तरफ ध्यान दें: सीएमवाईके टिफ्स को परिवर्तित करने से कुछ उल्लेखनीय टिनटिंग पैदा होती है और हमने अभी तक इससे छुटकारा पाने का प्रबंधन नहीं किया है। – Thomas

+1

आज मैंने एक ऐसी छवि हिट की जहां सांसेलन के आईसीसीप्रोफाइल में कलरस्पेस टाइप सीएमवाईके है जबकि इमेजइन्फो का कलरटाइप आरजीबी है। रंग अंतरिक्ष वास्तव में आरजीबी है। आश्चर्य है कि अगर आपको एक ही समस्या है। –

2

हमारी वेब आवेदन हम उन्हें प्रदर्शित नहीं कर सकता क्योंकि आईई 8 सीएमवाइके छवियों (JPEG) का समर्थन नहीं कर सकते हैं और नीचे में। इस प्रकार हमें यह पता लगाने की आवश्यकता है कि ऐसी छवि अपलोड करना और इसे अस्वीकार करना चाहता है।

मैं अपने से सहमत नहीं हैं "इस प्रकार हम पता लगाने के लिए जब कोई इस तरह के एक छवि अपलोड करें और यह इनकार करना चाहता है की जरूरत है"। सीएमवाईके की तुलना में इसे और अधिक उपयोगकर्ता-अनुकूल नीति में परिवर्तित करना होगा।

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

btw बोल्ड में लिखने के लिए कोई ज़रूरत नहीं:

वहाँ जो मज़बूती से पहचान लेता है और संभवतः सीएमवाइके छवियों धर्मान्तरित जय ImageIO के लिए किसी भी शुद्ध जावा विकल्प है?

शुद्ध जावा मुझे नहीं पता, लेकिन ImageMagick सीएमवाईके छवि को आरजीबी वाले में परिवर्तित करने के लिए ठीक काम करता है। जावा से सर्वर-साइड पर छवि मैगिक कॉल करना वास्तव में जटिल नहीं है। मैं बाहरी प्रक्रिया को कॉल करके मैन्युअल रूप से ऐसा करता था लेकिन आजकल जेएमएजिक और im4java जैसे रैपर हैं।

+0

उपयोगकर्ता के अनुकूल होने के लिए: सीएमवाईके को आरजीबी में कनवर्ट करना कभी-कभी रंगों को थोड़ा सा चमकता है और इस प्रकार हम उपयोगकर्ता को मैन्युअल रूप से इसे परिवर्तित करना चाहते हैं और रंगों की पुष्टि अभी भी ठीक है। किसी अन्य एप्लिकेशन में हम इस पर ध्यान दिए बिना स्वतंत्र रूप से परिवर्तित हैं, इस प्रकार मैंने दोनों के लिए पूछा। – Thomas

+0

'बोल्ड बीटीडब्ल्यू में लिखने की कोई ज़रूरत नहीं है:' - यह उन लोगों के लिए प्रश्न को चिह्नित करने के लिए था जो क्लर्कर को पढ़ने के लिए नहीं चाहते हैं :) – Thomas

+0

'ImageMagick' से संबंधित: यह एक विकल्प हो सकता है हालांकि हमें आवश्यकता होगी इसे भी स्थापित करने के लिए। उस सुझाव के लिए धन्यवाद। – Thomas

4

मैंने जेपीईजी छवियों के सभी प्रकार पढ़ने और उन्हें आरजीबी में परिवर्तित करने के लिए एक शुद्ध जावा solution पोस्ट किया है।

  • ImageIO एक बफ़र छवि के रूप में सीएमवाईके साथ JPEG चित्रों को नहीं पढ़ सकता है, यह कच्चे पिक्सेल डेटा पढ़ सकते हैं (रेखापुंज):

    यह निम्न तथ्यों पर बनाया गया है।

  • संसलन (या अपाचे कॉमन्स इमेजिंग जिसे अब कहा जाता है) का उपयोग सीएमवाईके छवियों के विवरण को पढ़ने के लिए किया जा सकता है।
  • उलटा सीएमवाईके मूल्यों (एक पुरानी फ़ोटोशॉप बग) वाली छवियां हैं।
  • सीएमवाईके के बजाय वाईसीसीके के साथ छवियां हैं (आसानी से परिवर्तित हो सकती हैं)।
2

एक और पोस्ट से सावधान रहें क्योंकि जावा 7 import com.sun.image.codec.jpeg.* में बताए गए विशेष पैरामीटर के बिना सीधे सूर्य के कार्यान्वयन का उपयोग करने की अनुमति नहीं देता है।

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