1

是否可以在不将所有像素复制到新的 BufferedImage 对象的情况下更改现有 BufferedImage 对象的颜色空间?我找不到方法,但也许我只是没有找到它?我想将颜色空间从 BufferedImage.TYPE_4BYTE_ABGR 更改为 BufferedImage.TYPE_BYTE_BINARY。

4

1 回答 1

2

不。

来自Java 文档

TYPE_4BYTE_ABGR
表示具有 8 位 RGBA 颜色分量的图像,其中蓝色、绿色和红色存储在 3 个字节和 1 个字节的 alpha 中。

TYPE_BYTE_BINARY
表示不透明的字节压缩 1、2 或 4 位图像。

像素的大小不同 - 4B 与 1B。即使可以在 Java 结构对象中修改图像的元数据,由于像素大小不同,这也不应该在原地工作 (*)。

(*) 新缓冲区更小,因此理论上应该可以通过创建包含相同缓冲区(但未完全使用)的新图像来重用内存。
您仍然需要编写自己的循环,按缓冲区中的放置顺序迭代像素,修改它们的颜色空间(ARGB-> 强度),并将它们写入源像素 /4 所在的位置。
尝试使用这个构造函数重用缓冲区:BufferedImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable properties)

于 2012-05-06T16:04:13.390 回答