2011-04-29 12 views
9

किसी कारण से, ImageBuffer और ImageIO का उपयोग करके कुछ पीएनजी फ़ाइलों को खोलना काम नहीं करता है। यहाँ है कि आकार बदलने/फसल JPGs के लिए ठीक काम करता है कुछ कोड मैं का उपयोग कर रहा है:मैं पीएनजी फ़ाइल को सही तरीके से पढ़ने के लिए जावा की छविबफर कैसे बना सकता हूं?

BufferedImage image = ImageIO.read(new File(location)); 

BufferedImage croppedImage = image.getSubimage(
    cropInfo.getX(), cropInfo.getY(), cropInfo.getW(), cropInfo.getH()); 

BufferedImage resizedImage = new BufferedImage(
    TARGET_WIDTH, TARGET_HEIGHT, croppedImage.getType()); 
Graphics2D g = resizedImage.createGraphics(); 
g.drawImage(croppedImage, 0, 0, TARGET_WIDTH, TARGET_HEIGHT, null); 
g.dispose(); 

this.changeContentType("image/png", ".png"); // not really relevant. just a property 

ImageIO.write(resizedImage, "png", new File(location)); 

return resizedImage; 

इस समारोह के लक्ष्य को लेने के लिए जो कुछ भी प्रकार दिया जाता है, आकार बदलने और चित्र काटने के लिए, और फिर एक ही साथ PNG में सहेज है फ़ाइल का नाम।

यह विंडोज पर काम करता है, लेकिन अगर मैं लिनक्स (लेन) पर फसल/आकार बदलता हूं, तो यह पूरी तरह से दुर्घटनाग्रस्त हो जाता है और फ़ाइल के प्रकार के बारे में शिकायत करता है (यह कहता है कि प्रकार 0 है)।

java.lang.IllegalArgumentException: Unknown image type 0 
    java.awt.image.BufferedImage.<init>(BufferedImage.java:490) 
    trainingdividend.domain.file.ServerImage.resizeImage(ServerImage.java:68) 
    trainingdividend.domain.file.ServerImage.cropAndResize(ServerImage.java:80) 
    trainingdividend.service.user.UserAccountManagerImpl.cropAvatar(UserAccountManagerImpl.java:155) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

समाधान?

क्या कोई अन्य लाइब्रेरी है जिसका मैं पूरी तरह से उपयोग कर सकता हूं?

+0

लिनक्स में आप किस जेवीएम का उपयोग कर रहे हैं? (संपादित करें: स्टैक ट्रेस में 'sun.reflect' द्वारा निर्णय लेना, यह सूर्य है, लेकिन केवल यह सुनिश्चित करने के लिए) –

+0

हां, नवीनतम सूर्य जेवीएम। 1.6_24 – egervari

+0

ठीक है मैंने इसे ठीक किया है। मैंने वहां एक हैक लगाया है, जहां image.getType() == 0, मैन्युअल रूप से इसे 5 पर सेट करता है। यह काम करता है। – egervari

उत्तर

4

विंडोज़ पर अपना फ़ंक्शन चलाते समय, फसल की गई Imaged.getType() मान 5 देता है। तो, सरल "हैक" प्रकार को स्टोर करना है, यह देखने के लिए जांचें कि यह 0 है या नहीं और यदि यह है, तो सेट करें 5 मैन्युअल रूप से मूल्य।

int imageType = croppedImage.getType(); 
if(imageType == 0) imageType = 5; 

हम तो imageType में पारित बजाय और यह लिनक्स पर काम करना चाहिए।

मुझे यकीन है कि इसमें कमी है कि यदि मूल्य अन्य मामलों में 0 है, तो यह इसे 5 पर सेट करेगा और यह गलत होगा। हालांकि, यह लिनक्स पर सामान्य छवि प्रकारों के लिए काम करता प्रतीत होता है और इससे कोई समस्या नहीं हुई है।

यह स्पष्ट है कि जावा 1.6 का विंडोज संस्करण बिल्कुल ठीक है, लेकिन लिनक्स संस्करण में इसमें एक बग है।

1

egervari, आप imgscalr (अपाचे 2) की तरह एक पुस्तकालय के लिए उपयोग कर सकते हैं आप "ठीक से" है कि एक very simple API साथ इस तरह की समस्याओं का समाधान करता सभी आकार बदलने करने के लिए - यह फसल के साथ मदद नहीं करेगा, लेकिन आकार बदलने है यह सबसे अच्छा क्या करता है (अलग-अलग गति, गुण, यहां तक ​​कि एंटी-एलियासिंग यदि आप चाहते हैं)।

मैं इंगित करता हूं कि अब आप जिस कोड का उपयोग कर रहे हैं (एक कस्टम प्रकार को 3BYTE_BGR प्रकार में मजबूर करना) को अल्फा चैनल के साथ इनबाउंड छवियों के लिए भी जिम्मेदार होना चाहिए।

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

फिर, imgscalr यह सब आपके लिए स्वचालित रूप से ख्याल रखता है यदि आप इसे आज़मा देना चाहते थे, लेकिन यदि नहीं, तो मुझे लगा कि मैं केवल सिर के ऊपर कुछ सिरदर्द में भाग ले रहा था।

जावा छवि प्रसंस्करण ... मनमौजी है :)

0

का संभावित हल समाधान प्रथम JPEG के लिए फ़ाइल को रूपांतरित करने होगा, और फिर इसे संसाधित करते हैं। टाइप 0 बग ज्यादातर पीएनजी छवियों को प्रभावित करता है।

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