如何决定使用哪种 BufferedImage 图像类型?

How to decide which BufferedImage image type to use?

Java BufferedImage class 有一长串 class 变量,称为图像类型,可用作 BufferedImage 构造函数的参数。

但是,Java 文档对这些图像类型的用途以及它们将如何影响要创建的 BufferedImage 做了简单的解释。

我的问题是:

  1. 图像类型如何影响要创建的 BufferedImage?它是否控制用于存储各种颜色(红色、绿色、蓝色)的位数及其透明度?

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

    • 一张不透明的图片
    • 一张透明图片
    • 半透明图像

Java文档中的描述我看了很多遍,就是想不通应该怎么用。比如这个:

TYPE_INT_BGR

Represents an image with 8-bit RGB color components, corresponding to a Windows- or Solaris- style BGR color model, with the colors Blue, Green, and Red packed into integer pixels. There is no alpha. The image has a DirectColorModel. When data with non-opaque alpha is stored in an image of this type, the color data must be adjusted to a non-premultiplied form and the alpha discarded, as described in the AlphaComposite documentation.

除非您有特定要求(例如节省内存或节省计算或特定的本机像素格式),否则请使用默认值 TYPE_INT_ARGB,每个通道 8 位,3 个通道 + alpha。

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

基本上你有:

  • TYPE_INT_ARGB,每个像素 4 个字节,带 alpha 通道
  • TYPE_INT_ARGB_PRE,每个像素 4 个字节,与以前相同,但颜色已经乘以像素的 alpha 以节省计算
  • TYPE_INT_RGB,每个像素 4 个字节,没有 alpha 通道
  • TYPE_USHORT_555_RGBTYPE_USHORT_565_RGB,每个像素2个字节,颜色少很多,除非你有内存限制,否则不需要使用它

然后有所有相同类型的交换频道的格式(例如 BGR 而不是 RGB)。您应该选择适合您平台的一种,这样可以减少转换。