2012-10-14 13 views
6

Ich habe ein Bild von sagen Dimensionen 800x800, die eine Größe von 170 kb hat. Ich möchte dieses Bild verkleinern, um 600x600 zu sagen. Nach der Größenänderung möchte ich die Bildgröße reduzieren. Wie kann ich das machen?Bildgrößenanpassung in Java, um die Bildgröße zu reduzieren

+0

Sie könnten einen Blick auf http://stackoverflow.com/questions/11959758/java-maintaining-aspect-ratio-of-jpanel-background-image/11959928#11959928 – MadProgrammer

+0

1) * "Nach der Größenänderung möchte ich die zu reduzierende Bildgröße. "* Wenn im Speicher gehalten oder in PNG, JPG oder GIF serialisiert? Die erste führt zu einer Reduzierung der Bytes, die zweite wird oft nicht. 2) Welches Format hat das Bild? (PNG, GIF, JPEG ..) –

+0

Wenn das Format JPEG ist, ist es höchstwahrscheinlich effektiver, die Bildbytegröße auf der Festplatte zu reduzieren, indem das Komprimierungsverhältnis erhöht wird. Siehe beispielsweise "ImageCompressionDemo" (http://stackoverflow.com/a/5998015/418556) als Quelle. –

Antwort

13

Sie benötigen keine vollständige Bildverarbeitungsbibliothek zum einfachen Ändern der Größe eines Bildes.

Der empfohlene Ansatz ist durch progressive bilinear mit Skalierung, wie so (fühlen Sie sich frei, diese Methode zu verwenden, wie in Ihrem Code ist):

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; 

} 

-Code geändert und von der ursprünglichen bei Filthy Rich Clients gereinigt.


Basierend auf Ihren Kommentar, können Sie Qualität und kodieren JPEG Bytes wie so reduzieren:

image die BufferedImage ist.

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(); 

Jetzt, da os ein ByteArrayOutputStream ist, können Sie Base64 kodieren.

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

Ich möchte die Bildgröße (in Bytes) nach der Größenanpassung reduzieren, so dass ich es über einen Socket senden kann. Der Datenausgabestrom sagt, dass die codierte Zeichenfolge (Base64) zu groß ist. – Madeyedexter

+0

Base64 codiert stattdessen JPEG-Bytes. Sie können 'ImageIO' dafür verwenden. – LanguagesNamedAfterCofee

+0

@Danish Siehe meine Bearbeitung – LanguagesNamedAfterCofee

3

Verwenden Sie ein gutes Framework, das Bildverarbeitung über Java unterstützt, z. IamageJ

Es gibt auch einige grundlegende Unterstützung in Java durch einige Klassen wie MemoryImageSource und PixelGrabber.

+0

Ich habe es überprüft. Ich möchte dies in meinem Java-Programm tun! – Madeyedexter

+0

Ich aktualisierte die Antwort mit grundlegenden Support-Informationen in Core Java. Ich hoffe, das hilft. –

5

Sie können die 100% Java, Apache2 Open-Source-imgscalr library (eine einzelne statische Klasse) und etwas tun, wie folgt verwenden:

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")); 
} 

HINWEIS: Wenn das schaut oben ungerade, die statische Import ermöglicht es mir, die resize Anruf ohne Scalr.resize Angabe direkt zu verwenden (...)

Außerdem, wenn die Qualität der gut aussehen geschrieben skalierte Bild aus genug nicht (es schnell geschrieben werden aber) Sie mehr Argumente für die die Größe Methode, wie so verwenden können:

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

.. und Sie können sogar gilt eine BufferedImageOp zu dem Ergebnis, es zu erweichen incase der Downscaling des Bild Look macht Jaggy:

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

Sie beginnen können nur um mit der Bibliothek spielen den folgenden dep Eintrag in Ihrem Maven POM (imgscalr in der Zugabe ist Maven Central Repo):

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

Ich verstehe die Lizenz nicht. Kann ich das in einer persönlichen Website verwenden? – Ced

+0

Was ist, wenn das Bild kleiner ist, wird es vergrößert? – Ced

Verwandte Themen