17

単純なPNGをJPEG形式に変換する際に問題が発生します。私は次のコードを使用しています:

..。

    File png = new File(filePath);
    try {
        SeekableStream s = new FileSeekableStream(png);
        PNGDecodeParam pngParams = new PNGDecodeParam();
        ImageDecoder dec = ImageCodec.createImageDecoder("png", s, pngParams);
        RenderedImage pngImage = dec.decodeAsRenderedImage();
        JPEGEncodeParam jparam = new JPEGEncodeParam();
        jparam.setQuality(0.50f); // e.g. 0.25f
        File jpeg = new File("jpeg.jpeg");
        FileOutputStream out = new FileOutputStream(jpeg);

        ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG", out, jparam); 

        encoder.encode(pngImage);

        s.close();

    } catch (IOException e) {
        ok = false;
        e.printStackTrace();
    }

    return ok;
}

..。

JAI例外が発生します->java.lang.RuntimeException:1つまたは3バンドのバイトデータのみを書き込むことができます。com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:148)で..。

オプションを使い果たしました。なにか提案を?

4

7 に答える 7

27

ImageIOPNGをaBufferedImageに読み込み、画像をJPEG形式で書き出す方が簡単な場合があります。

補遺:このアプローチでは、変換はライターによって透過的に処理されImageTranscoderます。

BufferedImage img = ImageIO.read(new File("image.png"));
ImageIO.write(img, "jpg", new File("image.jpg"));
于 2010-02-18T16:50:08.230 に答える
22

おそらく、jpgを書き込もうとする前に取り除く必要のあるアルファチャネルがpngにあります。

タイプTYPE_INT_RGB(TYPE_INT_ARGBではない)で新しいBufferedImageを作成し、ソースイメージ(pngImage)を新しい空白のイメージに書き込みます。

このようなもの(警告、テストされていないコード):

BufferedImage newImage = new BufferedImage( pngImage.getWidth(), pngImage.getHeight(), BufferedImage.TYPE_INT_RGB);
newImage.createGraphics().drawImage( pngImage, 0, 0, Color.BLACK, null);
于 2010-02-18T16:51:51.517 に答える
6

また、ImageIO(Java 6)を使用してPNG画像をBufferedImageに読み込み、JPGの「フォーマット名」に書き出すと画像が破損することもわかりました。画像はそこにありましたが、色は「太陽色」に見え、ほとんど反転していました。JPGファイルは確かにPNGファイルよりもはるかに小さかったので、多くの圧縮が行われました。圧縮や色深度をどのように制御できるかわかりません。

于 2013-03-26T22:40:12.247 に答える
5

JAIはインデックス付きカラーモデルでPNG画像を読み取り、8ビットグレースケールまたは24ビットカラー画像のみをJPEGファイルとして書き込むことができると思います。

このタスクにJAIを使用する必要がない場合は、代わりにImageIOを使用できるはずです。

ImageIO.write(ImageIO.read(new File("in.png")), "JPEG", new File("out.jpg"));
于 2010-02-18T16:50:56.857 に答える
5

他のソリューションで変換した後にファイルが破損しましたが、この方法はうまくいきました:

    public static void formatConverter(String pngFile, String jpgFile) {
        try {

            File input = new File(pngFile);
            File output = new File(jpgFile);

            BufferedImage image = ImageIO.read(input);
            BufferedImage result = new BufferedImage(
                    image.getWidth(),
                    image.getHeight(),
                    BufferedImage.TYPE_INT_RGB);
            result.createGraphics().drawImage(image, 0, 0, Color.WHITE, null);
            ImageIO.write(result, "jpg", output);

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

    }
于 2020-03-13T21:18:58.390 に答える
2

少し異なるコンテキストで次のメッセージが表示されていました。アルファチャネルを取り除くことで問題は解決しました

javax.imageio.IIOException: Sample size must be <= 8
    at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:435)
    at javax.imageio.ImageWriter.write(ImageWriter.java:580)
    at com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageWriter.write(Unknown Source)
    at net.sf.basedb.util.ImageTools.tiffToJpg(ImageTools.java:98)
    at net.sf.basedb.util.ImageTools.main(ImageTools.java:118)
于 2015-10-27T15:24:46.373 に答える
2

javaを使用したtransparentgif/pngからjpegへの変換を参照してください。

harmanjdによって投稿されたグラフィックス環境で再描画するソリューションをご覧ください。DirectColorModelを使用したソリューションはコンパイルされないため、消去する必要があります。そこに直接コメントするのに十分な担当者ポイントがありません。

于 2020-02-26T19:38:57.663 に答える