2009-06-04 6 views
7

मैं जावा का उपयोग कर जेपीईजी फ़ाइलों को संपीड़ित करना चाहता हूं। मैं इसे इस तरह कार्य करें:मैं उस छवि में किसी मेटाडेटा को खोए बिना जावा में जेपीईजी छवियों को कैसे कंप्रेस कर सकता हूं?

  1. रूप BufferedImage
  2. छवि पढ़ें संपीड़न दर के साथ एक और फाइल करने के लिए छवि लिखें।

ठीक है, आसान लगता है कि, लेकिन मैं आईसीसी रंग प्रोफाइल और EXIF ​​जानकारी नई फ़ाइल में चले गए हैं और छवि के डीपीआई से 240 72. करने के लिए यह मूल छवि से अलग दिखता है हटा दिया गया है लगता है। मैं ओएस एक्स में पूर्वावलोकन जैसे टूल का उपयोग करता हूं। यह अन्य जानकारी को प्रभावित किए बिना छवि की गुणवत्ता को पूरी तरह से बदल सकता है।

क्या मैं जावा में ऐसा कर सकता हूं? कम से कम आईसीसी रंग प्रोफाइल रखें और छवि रंग को मूल तस्वीर के समान दिखने दें?

उत्तर

1
/** 
* @param inputFilenameWithPath : binary filepath 
* @param outputFilepath  : output image path 
* @param start     : from where the image start in binary file 
* @param len     : length of the image 
* @throws ImageAccessException 
*/ 
public void extractImageFromBinaryFile(String inputFilenameWithPath, String outputFilepath, int start, int len) throws ImageAccessException 
{ 
    try 
    { 
     File file = new File(inputFilenameWithPath); 
     FileImageInputStream iis = new FileImageInputStream(file); 

     // Added 
     byte[] b = new byte[start]; 
     iis.read(b, 0, start); 

     byte[] fb = new byte[]{}; 
     iis.read(fb); 

     IIOByteBuffer iiob = new IIOByteBuffer(fb, start, len); 
     iis.readBytes(iiob, len); 

     OutputStream os = new FileOutputStream(outputFilepath); 
     os.write(iiob.getData()); 
     iis.close(); 
     os.close(); 

    } 
    catch (IOException ioe) 
    {`enter code here` 
     throw new ImageAccessException("Image File read/write error"); 
    } 
} 
+0

कृपया अपना कोड समझाएं। – hims056

+0

यह छवि को पढ़ने और आउटपुट के रूप में काम करने लगता है, लेकिन यह मुझे लगता है कि इसे संपीड़ित करने के लिए छवि की गुणवत्ता को बदलने के लिए समर्थन नहीं किया गया है। – guitarpoet

0

अंततः ऐसा करने का एक तरीका खोजें।

javax.imageio.IIOImage का उपयोग करें। इसे JpegImageReader द्वारा पढ़ा जा सकता है।

लेकिन इसमें एक बग था, एक बग 6 साल तक चल रहा था। :(

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4924909

सौभाग्य से

, अगर आप कुछ हैक (नकली JFIF अनुभाग) करते हैं, और यह काम करता है:।

    : डी

    तो, यह समस्या इस तरह हल किया जा सकता

  1. ImageIO उपयोग jpeg
  2. के लिए ImageReader पाने के लिए एक स्मृति बफर
  3. में jpeg छवि पढ़ें यह बग 4,924,909 पर विफल रहता है तो छवि buf ठीक हैं एक नकली जेएफआईएफ जानकारी के साथ फेर
  4. फ़ाइल लिखने के लिए ImageWriter का उपयोग करें, ImageWriterParam को चाल करने दें।

ठीक है, यह एक छवि को छोड़कर ठीक है (प्रत्येक जानकारी सहेजी गई) ठीक है, आउटपुट छवि मूल छवि की तुलना में उज्ज्वल है (या कहें, पीला) (यह तब नहीं होगा जब मैं पूर्वावलोकन का उपयोग करूं संकुचित तस्वीर को ओएस एक्स, तो समस्या मेरी कोड या जावा, या मेरे गलत उपयोग :() में होना चाहिए।

तो, जावा में jpeg संपीड़ित करने के लिए मेरी समस्या अभी तक हल नहीं किया गया है।

कोई सुझाव

+0

ठीक है, मैं हार मानता हूं। ImageIO अच्छी तरह से काम नहीं कर सकता मेरे लिए कम से कम)। मैं बस किसी भी जानकारी को खोए बिना इसे संपीड़ित करने के लिए छवि की गुणवत्ता को बदलना चाहता हूं और मूल तस्वीर के साथ जितना संभव हो उतना दिखता हूं। जावा मुझे असफल रहा, मैं ऐसा करने के लिए ImageMagic और JNI का उपयोग करने जा रहा हूं। शायद मैं गलत था। ऑरैकल से कोई भी मदद कर सकता है? – guitarpoet

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

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