我知道当我使用BufferedImage
时,我可以致电BufferedImage.getColorModel()
但是当我只有java.awt.Image
的实例时,如何获得相同的值?
=============================================== =====================================
已更新..
好的。现在让我解释一下我想要实现的目标:
我想创建一种方法来创建图像的缩略图。
首先,我将其转换为JPEG
文件格式图像并将结果写入文件,
然后我发现如果我这样做,我将失去原始图像的透明度,
所以我试图将目标图像保存为PNG
文件格式,并将BufferedImage标记为TYPE_BYTE_INDEXED
以减小目标文件大小,但最后我意识到如果现在原始图像本身包含大量的颜色,然后我会得到一个粗略的质量目标图像,因为TYPE_BYTE_INDEXED
不能包含很多颜色。
所以......现在我需要做一些研究,看看我是否可以从imageType
得到Image
。
如果imageType
原来是TYPE_BYTE_INDEXED
,那么我也可以在目标图片上使用TYPE_BYTE_INDEXED
,否则我可以使用TYPE_BYTE_ARGB
或TYPE_BYTE_RGB
(这取决于来源)原始图像的值)以确保我将使用高质量缩略图和较小尺寸的图像目标文件。
答案 0 :(得分:2)
最好的办法是使用返回RenderedImage的API获取图像(可以查询其ColorModel)。 由于java.awt.Image不提供任何查询其ColorModel的方法,因此任何猜测游戏都将涉及检查具体的实现类 - 这可能与实现有关。
如果您只想转换为特定的ColorModel,忽略图像所使用的ColorModel。创建所需类型(和大小)的BufferedImage,获取要渲染到其中的Graphics2D并将图像绘制到缓冲图像中。
编辑:回应'创建缩略图'
首先,即使如果原始图像使用的是索引颜色模型,您仍需要使用直接颜色模型进行缩略图 - 缩放索引颜色图像将产生混合颜色(由于像素)平均值很可能不包含在原始颜色映射中。如果你真的想加倍努力,你必须分析缩略图的像素数据,以决定是否可以使用索引颜色模型。
有一种半可靠的方法来确定源图像是否具有Alpha通道:
/**
* 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之后,只需为缩略图TYPE_INT_ARGB或TYPE_INT_RGB选择合适的BufferedImage.TYPE。
然后将图像渲染到缩略图图像中(这是一个冗长的例子):
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支持的任何格式保存缩略图图像。
答案 1 :(得分:0)
我不确切知道该方法的用途,但如果您可以在BufferdImage
上使用此方法,请尝试将java.awt.Image
转换为BufferedImage
。
答案 2 :(得分:-1)
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;
}
}