首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取java.awt.Image的ColorSpace?

如何获取java.awt.Image的ColorSpace?
EN

Stack Overflow用户
提问于 2012-08-20 17:18:49
回答 3查看 1.4K关注 0票数 0

我知道当我使用BufferedImage时,我可以调用BufferedImage.getColorModel(),但是当我只有一个java.awt.Image实例时,如何才能获得相同的值

====================================================================================

更新..

好的,所以。现在让我详细解释一下我想要实现的目标:

我想创建一个方法来创建一些图像的缩略图。

首先,我将其转换为JPEG文件格式的图像并将结果写入文件,然后我发现如果这样做,我将失去原始图像的透明度,所以我尝试将目标图像保存为PNG文件格式,并将BufferedImage标记为TYPE_BYTE_INDEXED以减少目标文件的大小,但最后我意识到,如果现在原始图像本身包含很多颜色,那么我将得到一个粗糙的质量目标图像,因为TYPE_BYTE_INDEXED不能包含很多颜色。

所以嗯..。现在我需要做一些研究,看看我是否可以从我得到的Image中获得imageType。如果imageType最初是TYPE_BYTE_INDEXED,那么我可以在目标图像上使用TYPE_BYTE_INDEXED,否则我可以使用TYPE_BYTE_ARGBTYPE_BYTE_RGB (这取决于原始图像的原始值),以确保我将创建一个高质量的缩略图和一个较小的图像目标文件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-20 17:37:05

我不知道这个方法到底是什么,但是如果你可以在BufferdImage上使用这个方法,那么试着把你的java.awt.Image转换成BufferedImage

票数 0
EN

Stack Overflow用户

发布于 2012-08-20 17:51:16

最好的方法是使用返回RenderedImage (可以查询其ColorModel)的接口来获取图像。由于java.awt.Image不提供任何方法来查询其ColorModel,因此任何猜测游戏都将涉及到检查具体的实现类-这很可能依赖于实现。

如果您只想转换为特定的ColorModel,请忽略图像正在使用的ColorModel。创建所需类型(和大小)的BufferedImage,获取要渲染到其中的Graphics2D,并将图像绘制到缓冲图像中。

编辑:响应“创建缩略图”

首先,即使原始图像使用索引颜色模型,您仍然需要使用缩略图的直接颜色模型-缩放索引颜色图像将产生混合颜色(由于像素平均),这些颜色很可能不包含在原始图像的颜色映射表中。如果你真的想走得更远,你必须分析缩略图的像素数据,以决定是否可以使用索引颜色模型。

有一种不太可靠的方法可以确定源图像是否具有alpha通道:

代码语言:javascript
复制
/**
 * Returns true if image has alpha channel
 */
public static boolean hasAlpha(final Image image) {
    // If buffered image, the color model is readily available
    if (image instanceof RenderedImage) {
        return ((RenderedImage) image).getColorModel().hasAlpha();
    }
    // Use a pixel grabber to retrieve the image's color model;
    // grabbing a single pixel is usually sufficient
    final PixelGrabber pixelGrabber = new PixelGrabber(image, 0, 0, 1, 1, false);
    try {
        pixelGrabber.grabPixels();
        return pixelGrabber.getColorModel().hasAlpha();
    } catch (final Exception e) {
        return true;
    }
}

对于模糊的图像类型,这可能会失败,但对于生成缩略图来说,它通常已经足够好了。在确定是否存在alpha之后,只需为缩略图选择合适的BufferedImage.TYPE,TYPE_INT_ARGB或TYPE_INT_RGB。

然后将图像渲染为缩略图(这是一个详细的示例):

代码语言:javascript
复制
    final boolean hasAlpha = hasAlpha(image);
    final int imageType =  hasAlpha ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB;
    final BufferedImage thumbnail = new BufferedImage(width, height, imageType);
    final Graphics2D g = thumbnail.createGraphics();
// set rendering hints according to desired quality
    g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    if (!hasAlpha) {
        g.drawImage(image, 0, 0, width, height, Color.WHITE, (ImageObserver) null);
    } else {
        g.drawImage(image, 0, 0, width, height, (ImageObserver) null);
    }
    g.dispose();

计算缩略图的适当宽度和高度留给读者作为练习。然后,可以使用ImageIO以ImageIO支持的任何格式保存缩略图。

票数 2
EN

Stack Overflow用户

发布于 2012-08-20 21:52:56

代码语言:javascript
复制
protected static BufferedImage toBufferedImage(Image image) {

        if (image instanceof BufferedImage) {
            return (BufferedImage) image;
        } else {

            int w = image.getWidth(null);
            int h = image.getHeight(null);

            BufferedImage bi = new BufferedImage(w, h,
                    BufferedImage.TYPE_INT_RGB);

            Graphics graphics = bi.getGraphics();
            graphics.drawImage(image, 0, 0, w, h, Color.WHITE, null);
            graphics.dispose();

            return bi;
        }

    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12035060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档