2009-04-01 14 views
19

क्या छवि गिरावट के बिना, 9 0 डिग्री की वृद्धि में जेपीईजी फ़ाइलों को घूर्णन करने के लिए जावा लाइब्रेरी है?लॉसलेस जेपीईजी घुमाव (90/180/270 डिग्री)?

+0

जावा में नहीं, लेकिन http://jpegclub.org/jpegtran/ लापरवाह जेपीईजी घूर्णन (विंडोज/लिनक्स) – Henry

+0

के लिए सबसे अच्छा कमांड लाइन उपयोगिता होना चाहिए नमस्ते अगर आपने नीचे समाधान का उपयोग किया है तो मैं आपकी सहायता का अनुरोध करना चाहता हूं आप ऐसा कर सकते हैं। मुझे java.awt.Rectangle आयात करने के लिए कहां मिलना मुश्किल है; मैंने वेब में कुछ जार की कोशिश की है लेकिन मैं एंड्रॉइड स्टूडियो के साथ उनका उपयोग नहीं कर सकता। क्या आप मुझे जार के साथ मदद कर सकते हैं जिसे आपने आयात किया है। धन्यवाद –

उत्तर

14
+0

बहुत साफ, बढ़िया खोज! –

+0

@ हेनरी हे, कृपया आप मुझे बता सकते हैं कि मैं इसका उपयोग करके छवि को कैसे सहेज सकता हूं .. जाहिर है यह पोस्ट मेरी मदद नहीं कर रहा है या मैं गलत तरीके से कर रहा हूं – therealprashant

-3

आप बात इस तरह का के लिए एक बाहरी पुस्तकालय की जरूरत नहीं है, यह सब एसई में बनाया गया है। ग्राफिक्स 2 डी ऑब्जेक्ट का घूर्णन() फ़ंक्शन सबसे आसान है।

उदाहरण के लिए:

Image rotatedImage = new BufferedImage(imageToRotate.getHeight(null), imageToRotate.getWidth(null), BufferedImage.TYPE_INT_ARGB); 

    Graphics2D g2d = (Graphics2D) rotatedImage.getGraphics(); 
    g2d.rotate(Math.toRadians(90.0)); 
    g2d.drawImage(imageToRotate, 0, -rotatedImage.getWidth(null), null); 
    g2d.dispose(); 

कोई नुकसान!

या, यदि आप अतिरिक्त सावधान रहना चाहते हैं, तो बस BufferedImage.getRGB (x, y) का उपयोग करें, और पिक्सेल द्वारा नई छवि पर पिक्सेल का अनुवाद करें।

+6

यह नुकसान नहीं होगा, क्योंकि आपको डीकोड करना होगा और पुनः- छवि को एन्कोड करें, जिसके परिणामस्वरूप डेटा का नुकसान होगा। सही ढंग से किए जाने पर, जेपीईजी 90 डिग्री चरणों में लापरवाही से घुमा सकते हैं। –

+0

यह अनुमान है कि पीएनजी/जीआईएफ के लिए यह ठीक है, लेकिन दुर्भाग्य से जेपीईजी को लापरवाही नहीं है। – Henry

+0

मुझे समझ में नहीं आता कि आप क्यों कहेंगे कि यह लापरवाह नहीं है? विशेष रूप से यदि आप इस ऑपरेशन पिक्सेल को पिक्सेल द्वारा कर रहे हैं? –

6

बिल्डिंग हेनरी के जवाब पर है, तो यहां MediaUtil उपयोग करने के लिए EXIF ​​डेटा के आधार पर दोषरहित जेपीईजी रोटेशन प्रदर्शन करने का एक उदाहरण है:

try { 
    // Read image EXIF data 
    LLJTran llj = new LLJTran(imageFile); 
    llj.read(LLJTran.READ_INFO, true); 
    AbstractImageInfo<?> imageInfo = llj.getImageInfo(); 
    if (!(imageInfo instanceof Exif)) 
     throw new Exception("Image has no EXIF data"); 

    // Determine the orientation 
    Exif exif = (Exif) imageInfo; 
    int orientation = 1; 
    Entry orientationTag = exif.getTagValue(Exif.ORIENTATION, true); 
    if (orientationTag != null) 
     orientation = (Integer) orientationTag.getValue(0); 

    // Determine required transform operation 
    int operation = 0; 
    if (orientation > 0 
      && orientation < Exif.opToCorrectOrientation.length) 
     operation = Exif.opToCorrectOrientation[orientation]; 
    if (operation == 0) 
     throw new Exception("Image orientation is already correct"); 

    OutputStream output = null; 
    try { 
     // Transform image 
     llj.read(LLJTran.READ_ALL, true); 
     llj.transform(operation, LLJTran.OPT_DEFAULTS 
       | LLJTran.OPT_XFORM_ORIENTATION); 

     // Overwrite original file 
     output = new BufferedOutputStream(new FileOutputStream(imageFile)); 
     llj.save(output, LLJTran.OPT_WRITE_ALL); 

    } finally { 
     IOUtils.closeQuietly(output); 
     llj.freeMemory(); 
    } 

} catch (Exception e) { 
    // Unable to rotate image based on EXIF data 
    ... 
} 
+0

मैंने Sanselan और MediaUtil दोनों के साथ EXIF ​​रोटेशन टैग पुनर्प्राप्त करने के साथ एक परीक्षण चलाया है, लेकिन ऊपर दिए गए मीडियाउटिल दृष्टिकोण llj.getImageInfo() पर मेरे लिए विफल रहता है; चरण (कोई EXIF ​​मेटाडेटा नहीं ढूंढ रहा है), जहां सैन्सेलन दृष्टिकोण EXIF ​​मेटाडेटा पाता है। ऐसा लगता है कि एलएलजेट्रान सभी आधुनिक जेपीईजी पढ़ने का समर्थन नहीं करता है। – JeroenHoek

+0

मैं अपनी गैलरी में सहेजी गई छवि को देखने में सक्षम नहीं हूं .. सटीक उसी कोड का प्रयास किया .. – therealprashant

+0

मुझे java.awt.Rectangle आयात करने के लिए कठिनाइयों का सामना करना पड़ता है; मैंने वेब में कुछ जार की कोशिश की है लेकिन मैं एंड्रॉइड स्टूडियो के साथ उनका उपयोग नहीं कर सकता। क्या आप मुझे जार के साथ मदद कर सकते हैं जिसे आपने आयात किया है। धन्यवाद –

6

EXIF ​​डेटा के मुद्दे के बारे में जरूरी ठीक से समाधान नहीं किया जा रहा, EXIF ​​डेटा के बाद से

final File    SrcJPEG = new File("my-input.jpg"); 
final File    DestJPEG = new File("my-output.jpg"); 
final FileInputStream In  = new FileInputStream(SrcJPEG); 

try { 
    final LLJTran   LLJT = new LLJTran(In); 

    LLJT.read(LLJTran.READ_ALL, true); 
    LLJT.transform(LLJTran.ROT_90); 

    final FileOutputStream Out = new FileOutputStream(DestJPEG); 

    try { 
     LLJT.save(Out, LLJTran.OPT_WRITE_ALL); 
    } finally { 
     Out.close(); 
    } 

} finally { 
    In.close(); 
} 

आप करते हैं इनपुट और आउटपुट File वस्तुओं refe: कई स्थितियों में अप्रासंगिक है, यहाँ (user113215 करने के लिए धन्यवाद के साथ) केवल LLJTran दोषरहित जेपीईजी रोटेशन सुविधा का प्रदर्शन उदाहरण कोड है एक ही फ़ाइल में, आप इसे बार-बार चला सकते हैं, और देख सकते हैं कि छवि खराब नहीं होती है, इससे कोई फर्क नहीं पड़ता कि इसे कितने पुनरावृत्तियों के माध्यम से रखा जाता है।

+0

मैं इस विधि का उपयोग कर छवि को सहेजने और इसे गैलरी में देखने में सक्षम नहीं हूं ... कृपया मदद करें – therealprashant