60

jpegファイルに書き込もうとしているBufferedImageがありますが、Javaプログラムが例外をスローします。同じバッファをgifとpngに正常に保存できます。私は解決策をGoogleで探し回ってみましたが、役に立ちませんでした。

コード:

   File outputfile = new File("tiles/" + row + ":" + col + ".jpg");
   try {
       ImageIO.write(mapBufferTiles[row][col], "jpg", outputfile);
   } catch (IOException e) {
        outputfile.delete();
        throw new RuntimeException(e);
   }

例外:

 Exception in thread "main" java.lang.RuntimeException: javax.imageio.IIOException: Invalid argument to native writeImage
 at MapServer.initMapBuffer(MapServer.java:90)
 at MapServer.<init>(MapServer.java:24)
 at MapServer.main(MapServer.java:118)
 Caused by: javax.imageio.IIOException: Invalid argument to native writeImage
 at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method)
 at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeOnThread(JPEGImageWriter.java:1055)
 at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:357)
 at javax.imageio.ImageWriter.write(ImageWriter.java:615)
 at javax.imageio.ImageIO.doWrite(ImageIO.java:1602)
 at javax.imageio.ImageIO.write(ImageIO.java:1526)
 at MapServer.initMapBuffer(MapServer.java:87)
 ... 2 more
4

5 に答える 5

46

OpenJDKにはネイティブJPEGエンコーダーがないため、SunのJDKを使用するか、ライブラリ(JAIなど)を使用してみてください

AFAIK、「ピンクがかった色合い」に関して、JavaはJPEGをARGBとして保存します(透明度情報はそのままです)。ほとんどの視聴者は、開くときに、4つのチャネルがCMYK(ARGBではなく)に対応している必要があると想定しているため、赤みがかっています。

ただし、画像をJavaにインポートして戻すと、透明度はそのまま残ります。

于 2010-08-07T23:57:33.993 に答える
36

私はOpenJDK7でも同じ問題を抱えていましたが、同じOpenJDKを使用する代わりに、imageTypeを使用してこの例外を回避することができました。TYPE_3BYTE_BGRTYPE_4BYTE_ABGR

于 2013-07-24T22:12:05.003 に答える
23

2019年の回答:BufferedImageにアルファ透明度がないことを確認してください。JPEGはアルファをサポートしていないため、画像にアルファがある場合、ImageIOはそれをJPEGに書き込むことができません。

次のコードを使用して、画像にアルファ透明度がないことを確認します。

static BufferedImage ensureOpaque(BufferedImage bi) {
    if (bi.getTransparency() == BufferedImage.OPAQUE)
        return bi;
    int w = bi.getWidth();
    int h = bi.getHeight();
    int[] pixels = new int[w * h];
    bi.getRGB(0, 0, w, h, pixels, 0, w);
    BufferedImage bi2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    bi2.setRGB(0, 0, w, h, pixels, 0, w);
    return bi2;
}
于 2019-08-23T13:02:31.560 に答える
5

画像タイプをTYPE_3BYTE_BGRに変更する@Thunderのアイデアを説明するためのコードを次に示します。

try {
  BufferedImage input = ImageIO.read(new File("input.png"));
  System.out.println("input image type=" + input.getType());
  int width = input.getWidth();
  int height = input.getHeight();
  BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
  int px[] = new int[width * height];
  input.getRGB(0, 0, width, height, px, 0, width);
  output.setRGB(0, 0, width, height, px, 0, width);
  ImageIO.write(output, "jpg", new File("output.jpg"));
} catch (Exception e) {
  e.printStackTrace();
}
于 2019-09-16T17:03:51.017 に答える
1

同じエラーが発生します

Caused by: javax.imageio.IIOException: Invalid argument to native writeImage
at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method)
at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeOnThread(JPEGImageWriter.java:1055)

サポートされていないカラースペース(私の場合はCYMK)を使用している場合。JavaでCMYKからRGBに正しく変換する方法を参照してください。これを解決する方法。

于 2017-01-26T09:15:26.437 に答える