0

CMYKカラーも扱うApacheSanselanを使用して、多くのjpeg画像のサイズを変更しています。アルファチャネルを持つjpeg画像を変換しようとすると問題が発生します...変換すると、結果は異なる色の画像になります。Javaは、これらのタイプの画像を異なる色の形式として処理するのではないかと思います。私が言ったように、RGBのサイズ変更はCMYKと同様にうまく機能します。ARGB画像はさまざまな色で表示されます。

例: サイズ変更前

サイズ変更後

助言がありますか?どういうわけかアルファチャネルを無視して、画像をRGB画像として処理することを強制できますか?または、実際の色を失うことなくRGB画像に変換しますか?

この画像を処理するコードは次のとおりです。

    ImageInputStream stream = ImageIO.createImageInputStream(file);
    Iterator<ImageReader> iter = ImageIO.getImageReaders(stream);
    while (iter.hasNext()) {
        ImageReader reader = iter.next();
        reader.setInput(stream);

        BufferedImage image = null;
        ICC_Profile profile = null;
        try {
            image = reader.read(0);

        } catch (IIOException e) {
            ... (CMYK conversion if needed)
        }

        return image;
    }
    return null;

前もって感謝します

4

1 に答える 1

2

私はここで良い解決策を見つけました(最初の解決策はうまくいきました):

ImageIO.writejpgファイルの使用に関する問題

編集: CMYK処理をサポートする新しいオープンソースライブラリがあります。プロジェクトに依存関係を追加するだけで、新しいリーダーがリーダーのリストに追加されます(既知のJPEGImageReaderはCMYKを処理できません)。これらのリーダーを繰り返し処理し、例外をスローしない最初のリーダーを使用して画像を読み取ることをお勧めします。このパッケージはリリース候補ですが、私はそれを使用していて、私たちが対処するのに苦労した大きな問題を解決しました。

http://mvnrepository.com/artifact/com.twelvemonkeys.imageio/imageio-jpeg/3.0-rc5

この方法で反復を実行してBufferedImageを取得できます。取得後、残りは簡単です(既存の画像変換パッケージを使用して、別の形式で保存できます)。

try (ImageInputStream input = ImageIO.createImageInputStream(source)) {

        // Find potential readers
        Iterator<ImageReader> readers = ImageIO.getImageReaders(input);

        // For each reader: try to read
        while (readers != null && readers.hasNext()) {
            ImageReader reader = readers.next();
            try {
                reader.setInput(input);
                BufferedImage image = reader.read(0);
                return image;
            } catch (IIOException e) {
                // Try next reader, ignore.
            } catch (Exception e) {
                // Unexpected exception. do not continue
                throw e;
            } finally {
                // Close reader resources
                reader.dispose();
            }
        }

        // Couldn't resize with any of the readers
        throw new IIOException("Unable to resize image");
    }
于 2012-09-24T08:21:54.983 に答える