0

我正在使用 Apache Sanselan 调整许多 jpeg 图像的大小,它也处理 CMYK 颜色。我在尝试转换具有 alpha 通道的 jpeg 图像时遇到问题......当这样做时,结果是一个具有不同颜色的图像,我猜 java 以某种方式将这些类型的图像处理为不同的颜色格式。正如我所说,RGB 调整大小和 CMYK 一样好。ARGB 图像呈现出不同的颜色。

一个例子: 调整大小之前

调整大小后

有什么建议么?我可以强制以某种方式忽略 alpha 通道并将图像作为 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.write jpg 文件的问题

编辑: 有一个支持 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 回答