Heim  >  Artikel  >  Java  >  Ausführliche Erklärung von Java mit ImageIO.writer zum Generieren von JPEG-Bildern aus BufferedImage, Zusammenfassung und Lösungen für aufgetretene Probleme

Ausführliche Erklärung von Java mit ImageIO.writer zum Generieren von JPEG-Bildern aus BufferedImage, Zusammenfassung und Lösungen für aufgetretene Probleme

黄舟
黄舟Original
2017-03-25 10:42:494171Durchsuche

Dieser Artikel stellt hauptsächlich die relevanten Informationen zur Zusammenfassung und Lösungen für die Probleme vor, die beim Generieren von JPEG-Bildern aus BufferedImage mit ImageIO.writer in Java auftreten. Freunde in Not können sich auf

Java mit ImageIO beziehen .writer zum Generieren von JPEG-Bildern aus BufferedImage. Zusammenfassung und Lösungen für Probleme, die beim Generieren von JPEG-Bildern auftreten

Das Generieren von JPEG-Bildern ist eine sehr, sehr einfache Sache. Viele Einführungen im Internet verwenden direkt com.sun.image.codec.jpeg. JPEGImageEncoder ist wie folgt implementiert:

  /**
   * 将原图压缩生成jpeg格式的数据
   * @param source
   * @return
   */
  public static byte[] wirteJPEGBytes(BufferedImage source){
    if(null==source)
      throw new NullPointerException();
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    JPEGImageEncoder jencoder = JPEGCodec.createJPEGEncoder(output);
    JPEGEncodeParam param = jencoder.getDefaultJPEGEncodeParam(source);
    param.setQuality(0.75f, true);
    jencoder.setJPEGEncodeParam(param);
    try {
      jencoder.encode(source);
    } catch (ImageFormatException e) {
      throw new RuntimeException(e);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
    return output.toByteArray();  
  }
JPEGImageEncoder ist nur die JPEG-Kodierungsimplementierung von Sun. Es wird nur in Sun unterstützt jvm, aber nicht auf anderen jvm.


Obwohl der obige Code unter Java 1.6 und 1.7 normal ausgeführt werden kann, meldet der obige Code bei Verwendung von Java 1.8 außerdem einen Fehler:

Zugriffsbeschränkungen: aufgrund Die erforderliche Bibliothek C:Program FilesJavajdk1.8.0_111jrelibrt.jar unterliegt bestimmten Einschränkungen, sodass auf den Typ JPEGImageEncoder


Ausführliche Erklärung von Java mit ImageIO.writer zum Generieren von JPEG-Bildern aus BufferedImage, Zusammenfassung und Lösungen für aufgetretene Probleme

nicht zugegriffen werden kann, sodass diese Methode Einschränkungen aufweist.


Es ist nicht möglich, Verknüpfungen zu verwenden. Die ImageIO-Klasse stellt die Methode ImageIO.writer zur Verfügung. Dies ist die formale Implementierungsmethode.


Aber es gibt auch Überlegungen bei der Verwendung der ImageIO.writer-Methode.


Ich habe es ursprünglich so geschrieben, dass ich einfach die Methode ImageIO.writer aufrufe, um JPEG-Daten zu generieren:

  /**
   * 将原图压缩生成jpeg格式的数据
   * @param source
   * @return
   * @see #wirteBytes(BufferedImage, String)
   */
  public static byte[] wirteJPEGBytes(BufferedImage source){
    return wirteBytes(source,"JPEG");
  }
  /**
   * 将原图压缩生成jpeg格式的数据
   * @param source
   * @return
   * @see #wirteBytes(BufferedImage, String)
   */
  public static byte[] wirteJPEGBytes(BufferedImage source){
    return wirteBytes(source,"JPEG");
  }
  /**
   * 将{@link BufferedImage}生成formatName指定格式的图像数据
   * @param source
   * @param formatName 图像格式名,图像格式名错误则抛出异常
   * @return
   */
  public static byte[] wirteBytes(BufferedImage source,String formatName){
    Assert.notNull(source, "source");
    Assert.notEmpty(formatName, "formatName");
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    try {      
      if(!ImageIO.write(source, formatName.toLowerCase(), output))
        // 返回false则抛出异常
        throw new IllegalArgumentException(String.format("not found writer for '%s'",formatName));

    } catch (IOException e) {
      throw new RuntimeException(e);
    }
    return output.toByteArray();    
  }
Es ist kein Problem, Zehntausende Bilder zu verarbeiten Bei einem PNG-Bild hat ImageIO.write tatsächlich „false“ zurückgegeben und eine Ausnahme ausgelöst.


Der Grund dafür ist, dass, wenn die ImageIO.wite-Methode die private Methode getWriter aufruft, um einen geeigneten ImageWriter zu finden, dieser nicht nur mit dem formatName zusammenhängt, sondern auch mit dem eingegebenen Originalbild (insbesondere wie es ist). ist verwandt, weil die Logik Die Beziehung ist zu kompliziert und wurde nicht eingehend untersucht), was dazu führt, dass die getWriter-Methode den entsprechenden ImageWriter nicht finden kann.


Es ist kein Problem, es so zu ändern, indem man sich auf die Schreibmethoden anderer Leute im Internet bezieht:

  /**
   * 将{@link BufferedImage}生成formatName指定格式的图像数据
   * @param source
   * @param formatName 图像格式名,图像格式名错误则抛出异常
   * @return
   */
  public static byte[] wirteBytes(BufferedImage source,String formatName){
    Assert.notNull(source, "source");
    Assert.notEmpty(formatName, "formatName");
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    BufferedImage newBufferedImage = new BufferedImage(source.getWidth(),
        source.getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics2D g = newBufferedImage.createGraphics();
    try {
      g.drawImage(source, 0, 0,null);
      if(!ImageIO.write(newBufferedImage, formatName, output))
        throw new IllegalArgumentException(String.format("not found writer for '%s'",formatName));
    } catch (IOException e) {
      throw new RuntimeException(e);
    }finally{
      g.dispose();
    }
    return output.toByteArray();    
  }
Die Grundidee besteht darin, ein BufferedImage derselben Größe neu zu erstellen, und verwenden Sie dann die Graphics.drawImage-Methode, um das Originalbild in ein neues BufferedImage

-Objekt zu schreiben. Durch diese Konvertierung werden die Unterschiede zwischen BufferedImage-Objekten, die durch verschiedene Arten von Bildformaten generiert werden, geglättet und anschließend ImageIO. write aufgerufen wird, um das neue ImageIO.write-Objekt Bildverarbeitung auszuführen, stellt kein Problem dar.

Verbesserung

In meinem Projekt werden die Bilddaten aus der

Suche im Internet abgerufen, aber die meisten Bildformate sind JPEG Es gibt auch eine kleine Anzahl von PNG-, BMP- und anderen Formaten. Meine ursprüngliche Methode ist effektiv, aber die obige Methode scheint etwas überflüssig zu sein und verschwendet Ressourcen, da sie einen weiteren Schritt erfordert Das Grundprinzip besteht darin, zunächst zu versuchen, ImageIO.write direkt zum Generieren von JPEG zu verwenden. Wenn dies fehlschlägt, verwenden Sie die zweite Methode.

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung von Java mit ImageIO.writer zum Generieren von JPEG-Bildern aus BufferedImage, Zusammenfassung und Lösungen für aufgetretene Probleme. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn