2009-08-13 12 views
10

जब मैं कुछ जेपीजी फाइलें पढ़ता हूं, तो रंगों को चपटा जाता है। यहां एक साधारण उदाहरण है जो एक jpg पढ़ता है और एक ही छवि को दूसरी फ़ाइल में लिखता है।क्यों जावा इमेजियो जेपीईजी रंगों को flattens

import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 

public class JPegReadTest { 
    public static void main(String[] args) { 
     if (args.length == 2) { 
      try { 
       BufferedImage src = ImageIO.read(new File(args[0])); 
       ImageIO.write(src, "jpg", new File(args[1])); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 
      System.err.println("Usage: java JPegReadTest src dest"); 
     } 
    } 
} 

आप उदाहरण http://www.flickr.com/photos/visualpanic/233508614/sizes/l/ के लिए के साथ इस कोशिश करते हैं, तो गंतव्य छवि के रंग स्रोत फ़ाइल से भिन्न होते हैं। ऐसा क्यों है? इसे कैसे जोड़ेंगे?

ने भी छवि को पीएनजी के रूप में सहेजने की कोशिश की, लेकिन इसमें रंग भी हैं (इसलिए रंगीन जानकारी को सही ढंग से नहीं पढ़ा जाता है)।

+0

आप यह पता लगाने कैसे रंग प्रोफ़ाइल को बचाने के लिये है? मुझे एक ही समस्या का सामना करना पड़ रहा है –

उत्तर

10

यह कई कारण हो सकता है।

  1. जेपीईजी रंग डेटा अक्सर आरजीबी के बजाय वाईसीआरसीबी के रूप में संग्रहीत किया जाता है, हालांकि रूपांतरण अधिकतर अनजान होना चाहिए।
  2. जेपीईजी में अक्सर एक एम्बेडेड रंग प्रोफाइल होता है, लेकिन कई एप्लिकेशन इसे समझ में नहीं आते हैं और इसे अनदेखा करते हैं (इस स्थिति में, आपकी आउटपुट फ़ाइल में रंग प्रोफाइल गुम हो सकता है)।
  3. जावा मैंगल्स के बाद गामा मान रीसेट या गायब हो सकता है।

मैंने वास्तव में आपके उदाहरण का प्रयास नहीं किया ... क्या आप कृपया फाइलों के पहले और बाद में पोस्ट कर सकते हैं? वास्तव में परिणाम फ़ाइल की जांच करने में सक्षम होने के बिना, यह कहना मुश्किल है कि यह अतिरिक्त डेटा है या नहीं।

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

+0

ठीक है, यहां पहले और बाद में फ़ाइलें हैं। http://terokinnunen.jalbum.net/Colortest/orig.jpg http://terokinnunen.jalbum.net/Colortest/converted-jpg.jpg भी नरम http PNG के रूप में बचत करने की कोशिश की, फिर भी: // terokinnunen .jalbum.net/Colortest/convert-png.png – ketorin

+0

दिलचस्प: मेरे लिए (उबंटू 9.04, फ़ायरफ़ॉक्स 3.5/गिंप) मूल और रूपांतरित रूप काफी समान (मॉडुलू जेपीईजी कलाकृतियों)। जीआईएमपी के साथ मुझे एकमात्र अंतर मिल सकता है कि मूल रंगीन स्थान के रूप में "एसआरबीबी आईईसी 61966-2.1" निर्दिष्ट करता है, जबकि परिवर्तित में "एसआरबीबी अंतर्निहित" होता है। –

+0

वे करते हैं? वास्तव में दिलचस्प है। मेरे लिए (मैक और सफारी या फ़ायरफ़ॉक्स) रंग परिवर्तित रूपों में उल्लेखनीय रूप से भिन्न हैं। मैंने विंडोज़ के साथ भी जांच की और मेरे आश्चर्य की बात है कि वे भी काफी समान दिखते हैं, केवल थोड़ा सा अंतर। – ketorin

0

जेपीजी एक हानिकारक प्रारूप है। जब पढ़ा जाता है, जावा इसे एक बीएमपी की तरह कच्चे प्रारूप के रूप में स्टोर करता है। फिर इसे डेटा हानि के कारण फिर से लिखा जा रहा है। इसके अलावा, गुणवत्ता पर अधिक नियंत्रण नहीं है जैसे कि जीआईएमपी जैसे कुछ का उपयोग करना।

शायद Image Magick जैसे अन्य API का उपयोग करके आप गुणवत्ता पर अधिक नियंत्रण देने के लिए इस पर गौर।

+2

अप्रासंगिक। ओपी केवल पुनर्मूल्यांकन से परे एक महत्वपूर्ण रंग-प्रोफाइल मुद्दा इंगित कर रहा है। – erjiang

0

JPEG एक lossy स्वरूप है।

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

अतिरिक्त ImageIO.write() शायद जेपीईजी फ़ाइलों को सहेजने के लिए कुछ डिफ़ॉल्ट गुणवत्ता सेटिंग्स का उपयोग करता है, जो मूल से कम हो सकता है, जो गुणवत्ता के अतिरिक्त नुकसान का कारण बनता है।

एक पीएनजी फ़ाइल में सहेजने का प्रयास करें और आप देखेंगे कि यह स्रोत के समान दिखाई देगा।

+0

मैंने पीएनजी को सहेजने की कोशिश की, लेकिन यह रंग में ब्लेंड भी दिखता है, जेपीजी सहेजी गई छवि के समान। मेरे पास एक झुकाव है कि रंग भी ठीक से नहीं पढ़े जाते हैं। – ketorin

+0

उस स्थिति में समस्या यह हो सकती है कि छवि में कुछ रंग प्रोफ़ाइल संग्रहीत की जाती है जिसे जावा पढ़/व्याख्या नहीं करता है। –

2

शायद अपने स्रोत छवि एक सरगम ​​sRGB से अधिक व्यापक साथ एक नियत रंग प्रोफ़ाइल, और अपने लोड (एडोब आरजीबी की तरह)/सहेजें चक्र colorspace जानकारी संरक्षण नहीं है गया है? बिना रंग प्रोफाइल के, आपका दर्शक एसआरबीबी मान लेगा, और संपीड़ित गामट सबकुछ "ब्लाह" दिखता है।आप exiftool है, तो

exiftool -ProfileDescription filename.jpg 

एक त्वरित तरीका है अपने स्रोत और उत्पादन चित्र पर रंग प्रोफाइल सत्यापित करने के लिए है।

+0

हां, यह समस्या हो सकती है, प्रोफ़ाइल वास्तव में आउटपुट फ़ाइलों से गायब है। यह धागा आशाजनक दिखता है: http://forums.java.net/jive/thread.jspa?threadID=60631&tstart=0, इसे अगले पर देखने के लिए जा रहा है। – ketorin

+0

ओह, यह गलत धागा था: http://forums.java.net/jive/message.jspa?messageID=205964 – ketorin

0

यहाँ कि ImageIO इंटरफेस पर फैलता स्रोत कोड के साथ एक लिंक है - जब एक छवि लेखन आप गुणवत्ता और संपीड़न मानकों को बदल सकते हैं .... http://www.universalwebservices.net/web-programming-resources/java/adjust-jpeg-image-compression-quality-when-saving-images-in-java

+0

यह अस्पष्ट है। क्या आपने इस सवाल से छवि के साथ कोशिश की है? असल में आप OP को * * दस्तावेज़ों को फिर से जांचने के लिए कह रहे हैं। और स्वीकृत उत्तर से पता चलता है कि यह उत्तर ओपी मुद्दों को हल नहीं करेगा। – andr