この記事では、Java で ImageIO.writer を使用して BufferedImage から jpeg 画像を生成する際に発生する問題の概要と解決策を主に紹介します。必要な友人は参考にしてください。
java ImageIO.writer を使用して BufferedImage から jpeg 画像を生成する際に発生する問題の概要そして、jpeg 画像の生成
を解決するのは、とてもとても簡単なことです。インターネット上の多くの紹介では、次のように、com.sun.image.codec.jpeg.JPEGImageEncoder を直接使用してそれを実現しています。 jpeg エンコーディング この実装は標準の Java API ではなく、sun jvm でのみサポートされますが、他の jvm ではサポートされません。
さらに、上記のコードは Java 1.6 および 1.7 では正常に実行できますが、Java 1.8 を使用すると、上記のコードはエラーを報告します:
アクセス制限: 必要なライブラリ C:Program FilesJavajdk1.8.0_111jrelibrt による.jar には特定の制限があるため、タイプ JPEGImageEncoder
にアクセスできないため、このメソッドには制限があります。
ショートカットを使用することはできません。それでも、ImageIO クラスは、指定された形式で画像を生成するための ImageIO.writer メソッドを提供します。これが正式な実装メソッドです。
ただし、ImageIO.writer メソッドを使用する場合は考慮すべき点もいくつかあります。
私はもともと次のように書きました。これは、単に ImageIO.writer メソッドを呼び出して jpeg データを生成するためです:
/** * 将原图压缩生成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(); }
png 画像に遭遇したとき、ImageIO.write は実際には何万もの画像ファイルを問題なく処理します。 false を返します。例外がスローされました。
その理由は、適切な ImageWriter を探すときに ImageIO.wite メソッドによって呼び出されるプライベート メソッド getWriter が、formatName に関連しているだけでなく、入力された元の画像にも関連しているためです (特に、それがどのように関連しているか、論理的なものであるため)関係が複雑すぎるため、詳しくは説明していません) が原因で、 getWriter メソッドが対応する ImageWriter を見つけることができなくなります。
インターネット上の他の人の書き方を参考にして、これに変更しても問題ありません:
/** * 将原图压缩生成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(); }
基本的な考え方は、同じサイズの BufferedImage を再作成し、Graphics.drawImage メソッドを使用して元の画像を書き込むことです。この変換により、さまざまな種類の画像形式によって生成された BufferedImage オブジェクト間の差異が平滑化され、新しい ImageIO.write オブジェクトに対して
画像処理を実行する場合、問題。 改善点
私のプロジェクトでは、画像データはインターネットから検索されますが、ほとんどの画像形式は jpeg ですが、少数の png、bmp、その他の形式もあります。ほとんどの jpeg 画像に対して、最初の方法は効果的ですが、上記の方法は少し冗長で、もう 1 つのステップが必要なためリソースを無駄にしているように思えます。そのため、基本的な原則は、上記の方法を直接 ImageIO.write に書き込むことを試みることです。 jpeg の生成に失敗した場合は、2 番目の方法を使用します。
りー以上がImageIO.writer を使用して BufferedImage から jpeg 画像を生成する Java の詳細な説明、発生した問題の概要と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。