2017-05-18 4 views
0

Ich versuche ein PNG Bild (6.8 MB) zu komprimieren, um seine Größe zu reduzieren, aber ich stehe vor dem Problem, dass ich zu viel von seiner Quilty verliere. Auch wenn ich diese Zeile kommentierensetze den richtigen Wert auf setCompressionQuality() wenn ich das Bild komprimiere

 param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
     param.setCompressionQuality(0.9f); 

I, wie in den Screenshots ein Bild bekommen, aber mit einer Größe von (812 KB). Mit den Linien bekomme ich ein PNG Bild mit der Größe von (1,24 MB) aber in beiden Fällen bekomme ich das Bild wie in den Screenshots ohne Unterschied in der Quility (auch mit schwarzem Hintergrund). Wie kann das Bild besser komprimiert werden? Auch ich dachte, ich könnte die Qualität vlaue konfigurieren, indem Sie einen Float-Wert zwischen 0-1 als die folgende setCompressionQuality (0.9f);

package ImageCompressor; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.util.Iterator; 

import javax.imageio.IIOImage; 
import javax.imageio.ImageIO; 
import javax.imageio.ImageWriteParam; 
import javax.imageio.ImageWriter; 
import javax.imageio.stream.ImageOutputStream; 


public class ImageComprossor { 

    public static void main(String[] args) { 
     BufferedImage img = null; 
     try { 

      File input = new File("strawberry.png"); 
      BufferedImage image = ImageIO.read(input); 

      File compressedImageFile = new File("strawberry_compressed.png"); 
      OutputStream os = new FileOutputStream(compressedImageFile); 

      Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); 
      ImageWriter writer = writers.next(); 

      ImageOutputStream ios = ImageIO.createImageOutputStream(os); 
      writer.setOutput(ios); 

      ImageWriteParam param = writer.getDefaultWriteParam(); 
      // Check if canWriteCompressed is true 
      if (param.canWriteCompressed()) { 
       param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
       param.setCompressionQuality(0.9f); 
      } 
      // End of check 
      writer.write(null, new IIOImage(image, null, null), param); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

Bildschirm enter image description here

+0

Warum verwenden Sie 'jpg', um den' ImageWriter' zu erhalten? Wenn Sie zu 'ImageIO.getImageWritersByFormatName (" png ")' wechseln und dann versuchen, die verfügbaren Komprimierungstypen zu erhalten (zB 'param.getCompressionTypes()'), erhalten Sie eine 'java.lang.UnsupportedOperationException: Compression nicht unterstützt '. –

Antwort

0

Ich hatte PNG in dieser Methode getImageWritersByFormatName ("PNG") einzustellen; dann sieht das Bild gleich aus, aber mit größerer Größe -> seine Größe beträgt 11.2MB.

Verwandte Themen