2012-10-14 5 views
6

मेरे पास आयाम आयाम 800x800 की एक छवि है जिसमें 170 केबी का आकार है। मैं 600x600 कहने के लिए इस छवि का आकार बदलना चाहता हूं। आकार बदलने के बाद मैं छवि आकार को कम करना चाहता हूं। मैं यह कैसे कर सकता हूँ?छवि आकार को कम करने के लिए जावा में छवि का आकार

+0

आप http://stackoverflow.com/questions/11959758/java-maintaining-aspect-ratio-of-jpanel-background-image/11959928#11959928 – MadProgrammer

+0

1) पर एक नज़र डाल सकते हैं * * * आकार बदलने के बाद मैं चाहता हूं छवि का आकार कम किया जा सकता है। "* जब स्मृति में आयोजित किया जाता है, या पीएनजी, जेपीजी या जीआईएफ को क्रमबद्ध किया जाता है? पहला परिणाम बाइट्स में कमी करेगा, दूसरा अक्सर नहीं होगा। 2) छवि क्या प्रारूप है? (पीएनजी, जीआईएफ, जेपीईजी ..) –

+0

यदि प्रारूप जेपीईजी है, तो यह संपीड़न अनुपात को बढ़ाकर डिस्क पर छवि बाइट आकार को कम करने के लिए अधिक प्रभावी होगा। उदाहरण स्रोत के लिए ['ImageCompressionDemo'] (http://stackoverflow.com/a/5998015/418556) देखें। –

उत्तर

13

आपको छवि को आकार देने के लिए पूर्ण उड़ा छवि प्रसंस्करण लाइब्रेरी की आवश्यकता नहीं है।

तरीका अपनाने का सुझाव प्रगतिशील द्विरेखीय स्केलिंग का उपयोग कर, की तरह तो (इस विधि का उपयोग करने के लिए स्वतंत्र महसूस हो रहा है के रूप में अपने कोड में है) कर रहा है:

public BufferedImage scale(BufferedImage img, int targetWidth, int targetHeight) { 

    int type = (img.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; 
    BufferedImage ret = img; 
    BufferedImage scratchImage = null; 
    Graphics2D g2 = null; 

    int w = img.getWidth(); 
    int h = img.getHeight(); 

    int prevW = w; 
    int prevH = h; 

    do { 
     if (w > targetWidth) { 
      w /= 2; 
      w = (w < targetWidth) ? targetWidth : w; 
     } 

     if (h > targetHeight) { 
      h /= 2; 
      h = (h < targetHeight) ? targetHeight : h; 
     } 

     if (scratchImage == null) { 
      scratchImage = new BufferedImage(w, h, type); 
      g2 = scratchImage.createGraphics(); 
     } 

     g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
       RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
     g2.drawImage(ret, 0, 0, w, h, 0, 0, prevW, prevH, null); 

     prevW = w; 
     prevH = h; 
     ret = scratchImage; 
    } while (w != targetWidth || h != targetHeight); 

    if (g2 != null) { 
     g2.dispose(); 
    } 

    if (targetWidth != ret.getWidth() || targetHeight != ret.getHeight()) { 
     scratchImage = new BufferedImage(targetWidth, targetHeight, type); 
     g2 = scratchImage.createGraphics(); 
     g2.drawImage(ret, 0, 0, null); 
     g2.dispose(); 
     ret = scratchImage; 
    } 

    return ret; 

} 

कोड में संशोधन किया और Filthy Rich Clients पर मूल से साफ किया।


अपनी टिप्पणी के आधार पर, आप तो जैसे गुणवत्ता और एनकोड जेपीईजी बाइट्स कम कर सकते हैं:

image BufferedImage है।

ByteArrayOutputStream os = new ByteArrayOutputStream(); 
ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName("jpeg").next(); 

ImageWriteParam param = writer.getDefaultWriteParam(); 
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
param.setCompressionQuality(0.2f); // Change this, float between 0.0 and 1.0 

writer.setOutput(ImageIO.createImageOutputStream(os)); 
writer.write(null, new IIOImage(image, null, null), param); 
writer.dispose(); 

अब, os के बाद से एक ByteArrayOutputStream है, तो आप Base64 यह सांकेतिक शब्दों में बदलना कर सकते हैं।

String base64 = Base64.encode(os.toByteArray()); 
+0

मैं आकार बदलने के बाद छवि आकार (बाइट्स में) को कम करना चाहता हूं ताकि मैं इसे सॉकेट पर भेज सकूं। डेटाआउटपुटस्ट्रीम का कहना है कि एन्कोडेड स्ट्रिंग (बेस 64) बहुत बड़ी है। – Madeyedexter

+0

बेस 64 इसके बजाय जेपीईजी बाइट एन्कोड करें। आप इसके लिए 'ImageIO' का उपयोग कर सकते हैं। – LanguagesNamedAfterCofee

+0

@Danish मेरा संपादन देखें – LanguagesNamedAfterCofee

3

जावा के माध्यम से छवि प्रसंस्करण का समर्थन करने वाले कुछ अच्छे ढांचे का उपयोग करें उदा। IamageJ

कुछ कक्षाओं जैसे MemoryImageSource और PixelGrabber के माध्यम से जावा में कुछ बुनियादी समर्थन भी उपलब्ध है।

+0

मैंने इसे चेक आउट किया। मैं इसे अपने जावा प्रोग्राम में करना चाहता हूं! – Madeyedexter

+0

मैंने कोर जावा में मूलभूत समर्थन जानकारी के साथ उत्तर अद्यतन किया। उम्मीद है की वो मदद करदे। –

5

आप 100% जावा, Apache2 खुला स्रोत imgscalr library (एक स्थिर वर्ग) इस्तेमाल कर सकते हैं और कुछ इस तरह करते हैं:

import org.imgscalr.Scalr.*; // static imports are awesome with the lib 

... some class code ... 

// This is a super-contrived method name, I just wanted to incorporate 
// the details from your question accurately. 
public static void resizeImageTo600x600(BufferedImage image) { 
    ImageIO.write(resize(image, 600), "JPG", new File("/path/to/file.jpg")); 
} 

नोट: ऊपर अजीब, स्थिर लग रहा है आयात मुझसे सीधे Scalr.resize (...)

साथ ही निर्दिष्ट किए बिना आकार कॉल का उपयोग करने की अनुमति देता है बाहर लिखा काफी अच्छा नहीं लगता बढ़ाया छवि की गुणवत्ता (इसे जल्दी बाहर लिखा जाएगा, हालांकि) आप के लिए और अधिक तर्क का उपयोग कर सकते आकार परिवर्तन तो जैसे विधि:

public static void resizeImageTo600x600(BufferedImage image) { 
    ImageIO.write(resize(image, Method.ULTRA_QUALITY, 600), "JPG", new File("/path/to/file.jpg")); 
} 

.. और तुम भी कर सकते हैं यह नरम करने के लिए बैठाना आकार घटाने की छवि नज़र बनाता दांतेदार के लिए परिणाम के लिए एक BufferedImageOp लागू होते हैं:

public static void resizeImageTo600x600(BufferedImage image) { 
    ImageIO.write(resize(image, Method.ULTRA_QUALITY, 600, Scalr.OP_ANTIALIAS), "JPG", new File("/path/to/file.jpg")); 
} 

आप बस अपनी Maven पोम (imgscalr में निम्नलिखित डीईपी प्रविष्टि जोड़कर पुस्तकालय साथ प्रयोग करना शुरू कर सकते हैं में है मेवेन सेंट्रल रेपो):

<dependency> 
    <groupId>org.imgscalr</groupId> 
    <artifactId>imgscalr-lib</artifactId> 
    <version>4.2</version> 
    <type>jar</type> 
    <scope>compile</scope> 
</dependency> 
+0

मुझे लाइसेंस समझ में नहीं आता है। क्या मैं इसे व्यक्तिगत वेबसाइट में उपयोग कर सकता हूं? – Ced

+0

यह भी क्या होगा यदि छवि छोटा है, तो क्या यह बढ़ जाएगा? – Ced