【问题标题】:How to decide which BufferedImage image type to use?如何决定使用哪种 BufferedImage 图像类型?
【发布时间】:2015-09-05 15:13:56
【问题描述】:

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

但是,Java 文档对这些图像类型的用途以及它如何影响要创建的 BufferedImage 做了一个最低限度的解释。

我的问题是:

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

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

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

我多次阅读 Java Doc 中的描述,但无法弄清楚我们应该如何使用它。比如这个:

TYPE_INT_BGR

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

【问题讨论】:

  • 什么是半透明图像?它与透明图像有何不同?
  • @AndyTurner 我记得我在某处读过它关于使部分图像透明而半透明是在调整整个图像的不透明度。例如,gif 文件允许透明但不允许半透明,而 png 文件支持两者。这是一个可能需要使用不同图像类型的示例。没有?

标签: java bufferedimage


【解决方案1】:

除非您有特殊要求(例如节省内存或节省计算量或特定的原生像素格式),否则请使用默认的 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)。你应该选择你平台的一个原生,这样可以减少转换。

【讨论】:

  • 感谢您的快速回复。所以我可以使用TYPE_InT_ARGB 来获得不透明、透明和半透明的图像,除非我有你提到的其他特殊需求?
  • 是的,半透明图像本身不是半透明的(除非所有像素都有 alpha)。您可以通过在目标帧缓冲区上使用 alpha 混合绘制图像来获得半透明。
  • 而且只要图像类型支持 alpha 通道,它就能支持透明度,我说得对吗?这是我的最后一个问题! :D
猜你喜欢
  • 2010-11-29
  • 2017-04-28
  • 2014-06-11
  • 2018-09-09
  • 1970-01-01
  • 2017-09-14
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多