Heim Java javaLernprogramm 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

Mar 25, 2017 am 10:42 AM

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

/**

 * 将原图压缩生成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(); 

}

Nach dem Login kopieren
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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

/**

 * 将原图压缩生成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();   

}

Nach dem Login kopieren
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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/**

 * 将{@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();   

}

Nach dem Login kopieren
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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Zwei -Punkte -Museum: Alle Exponate und wo man sie finden kann
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Quadratwurzel in Java. Hier diskutieren wir anhand eines Beispiels und seiner Code-Implementierung, wie Quadratwurzel in Java funktioniert.

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Armstrong-Zahl in Java Armstrong-Zahl in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Armstrong-Zahl in Java. Hier besprechen wir eine Einführung in die Armstrong-Zahl in Java zusammen mit einem Teil des Codes.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

See all articles