क्या छवि गिरावट के बिना, 9 0 डिग्री की वृद्धि में जेपीईजी फ़ाइलों को घूर्णन करने के लिए जावा लाइब्रेरी है?लॉसलेस जेपीईजी घुमाव (90/180/270 डिग्री)?
उत्तर
मैंने पाया इस: http://mediachest.sourceforge.net/mediautil/
एपीआई: http://mediachest.sourceforge.net/mediautil/javadocs/mediautil/image/jpeg/LLJTran.html
बहुत साफ, बढ़िया खोज! –
@ हेनरी हे, कृपया आप मुझे बता सकते हैं कि मैं इसका उपयोग करके छवि को कैसे सहेज सकता हूं .. जाहिर है यह पोस्ट मेरी मदद नहीं कर रहा है या मैं गलत तरीके से कर रहा हूं – therealprashant
आप बात इस तरह का के लिए एक बाहरी पुस्तकालय की जरूरत नहीं है, यह सब एसई में बनाया गया है। ग्राफिक्स 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) का उपयोग करें, और पिक्सेल द्वारा नई छवि पर पिक्सेल का अनुवाद करें।
यह नुकसान नहीं होगा, क्योंकि आपको डीकोड करना होगा और पुनः- छवि को एन्कोड करें, जिसके परिणामस्वरूप डेटा का नुकसान होगा। सही ढंग से किए जाने पर, जेपीईजी 90 डिग्री चरणों में लापरवाही से घुमा सकते हैं। –
यह अनुमान है कि पीएनजी/जीआईएफ के लिए यह ठीक है, लेकिन दुर्भाग्य से जेपीईजी को लापरवाही नहीं है। – Henry
मुझे समझ में नहीं आता कि आप क्यों कहेंगे कि यह लापरवाह नहीं है? विशेष रूप से यदि आप इस ऑपरेशन पिक्सेल को पिक्सेल द्वारा कर रहे हैं? –
बिल्डिंग हेनरी के जवाब पर है, तो यहां 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
...
}
मैंने Sanselan और MediaUtil दोनों के साथ EXIF रोटेशन टैग पुनर्प्राप्त करने के साथ एक परीक्षण चलाया है, लेकिन ऊपर दिए गए मीडियाउटिल दृष्टिकोण llj.getImageInfo() पर मेरे लिए विफल रहता है; चरण (कोई EXIF मेटाडेटा नहीं ढूंढ रहा है), जहां सैन्सेलन दृष्टिकोण EXIF मेटाडेटा पाता है। ऐसा लगता है कि एलएलजेट्रान सभी आधुनिक जेपीईजी पढ़ने का समर्थन नहीं करता है। – JeroenHoek
मैं अपनी गैलरी में सहेजी गई छवि को देखने में सक्षम नहीं हूं .. सटीक उसी कोड का प्रयास किया .. – therealprashant
मुझे java.awt.Rectangle आयात करने के लिए कठिनाइयों का सामना करना पड़ता है; मैंने वेब में कुछ जार की कोशिश की है लेकिन मैं एंड्रॉइड स्टूडियो के साथ उनका उपयोग नहीं कर सकता। क्या आप मुझे जार के साथ मदद कर सकते हैं जिसे आपने आयात किया है। धन्यवाद –
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 दोषरहित जेपीईजी रोटेशन सुविधा का प्रदर्शन उदाहरण कोड है एक ही फ़ाइल में, आप इसे बार-बार चला सकते हैं, और देख सकते हैं कि छवि खराब नहीं होती है, इससे कोई फर्क नहीं पड़ता कि इसे कितने पुनरावृत्तियों के माध्यम से रखा जाता है।
मैं इस विधि का उपयोग कर छवि को सहेजने और इसे गैलरी में देखने में सक्षम नहीं हूं ... कृपया मदद करें – therealprashant
जावा में नहीं, लेकिन http://jpegclub.org/jpegtran/ लापरवाह जेपीईजी घूर्णन (विंडोज/लिनक्स) – Henry
के लिए सबसे अच्छा कमांड लाइन उपयोगिता होना चाहिए नमस्ते अगर आपने नीचे समाधान का उपयोग किया है तो मैं आपकी सहायता का अनुरोध करना चाहता हूं आप ऐसा कर सकते हैं। मुझे java.awt.Rectangle आयात करने के लिए कहां मिलना मुश्किल है; मैंने वेब में कुछ जार की कोशिश की है लेकिन मैं एंड्रॉइड स्टूडियो के साथ उनका उपयोग नहीं कर सकता। क्या आप मुझे जार के साथ मदद कर सकते हैं जिसे आपने आयात किया है। धन्यवाद –