2015-09-05 86 views
5

Java BufferedImage类有一长串名为图像类型的类变量,可用作BufferedImage构造函数的参数。如何决定使用哪种BufferedImage图像类型?

但是,Java文档对这些图像类型的用途做了最小限度的说明,它将如何影响要创建的BufferedImage。

我的问题是:

  1. 图像类型如何会影响到BufferedImage中产生的呢?它是否控制用于存储各种颜色(红色,绿色,蓝色)的位数及其透明度?

  2. 我们应该使用哪种图像类型,如果我们只是想创建

    • 不透明图像
    • 透明图像
    • 半透明图像

我阅读了Java Doc中的描述很多次,但只是无法弄清楚我们应该如何使用它。例如,这样一句:

TYPE_INT_BGR

表示一个具有8位RGB颜色分量的图像,对应于Windows或Solaris风格的BGR颜色模型,与颜色蓝,绿,和红色打包成整数像素。没有阿尔法。该图像有一个DirectColorModel。当具有非透明alpha的数据存储在这种类型的图像中时,必须将颜色数据调整为非预乘形式,并丢弃alpha,如AlphaComposite文档中所述。

+0

什么是半透明图像?它与透明图像有什么不同? –

+0

@AndyTurner我记得我读过一些关于使图像的一部分透明的地方,而半透明的是调整整个图像的不透明度。例如,gif文件允许透明但不透明,而png文件支持两者。这是一个可能需要使用不同图像类型的示例。没有? – user3437460

回答

6

除非有特定的要求(例如保存存储器或保存计算或特定的本地像素格式)只是去与具有每通道8个比特,3个通道+阿尔法默认TYPE_INT_ARGB

在每个通道处理8位时跳过alpha通道不会影响图像占用的总内存,因为在任何情况下,每个像素都将打包在int中,因此8位将被丢弃。

基本上你有:每像素

  • TYPE_INT_ARGB,4个字节的alpha通道
  • TYPE_INT_ARGB_PRE,每像素4个字节,和以前一样,但颜色已经由像素保存计算的α相乘每像素
  • TYPE_INT_RGB,4个字节没有alpha通道
  • TYPE_USHORT_555_RGBTYPE_USHORT_565_RGB,每像素2个字节,少得多的颜色,不需要使用它UNL ess你有内存限制

然后有所有相同种类的格式与交换渠道(例如, BGR,而不是RGB)。你应该选择一个原生的平台,以减少转换。

+0

感谢您的快速回复。所以我可以使用'TYPE_InT_ARGB'来获得不透明,透明和半透明的图像,除非我有其他特殊需求,例如您提到的那样? – user3437460

+0

是的,半透明图像本身不是半透明的(除非所有像素都具有alpha)。您可以通过在目标帧缓冲区上使用alpha混合绘制图像来获得半透明效果。 – Jack

+0

只要图像类型支持alpha通道,它就能够支持透明度,我是否有权这么说?这是我最后一个问题! :d – user3437460