【发布时间】:2018-02-22 07:44:51
【问题描述】:
我一直在尝试将 java 中的 bufferedImages 作为 IntBuffers 加载。但是,我遇到的一个问题是从具有半透明或完全透明的图像中获取像素数据。 Java 似乎只允许您获取 RGB 值,在我的情况下这是一个问题,因为任何应该透明的像素都被渲染为完全不透明。经过大约几个小时的搜索,我发现了这种获取 RGBA 值的方法......
Color color = new Color(image.getRGB(x, y), true);
虽然它确实有效,但它不可能是最好的方法。有谁知道完成相同任务的更有效方法,不需要每个像素的颜色对象实例。如果您尝试加载相当大的图像,您可以看到这将是多么糟糕。这是我的代码,以防万一您需要参考...
public static IntBuffer getImageBuffer(BufferedImage image) {
int width = image.getWidth();
int height = image.getHeight();
int[] pixels = new int[width * height];
for (int i = 0; i < pixels.length; i++) {
Color color = new Color(image.getRGB(i % width, i / width), true);
int a = color.getAlpha();
int r = color.getRed();
int g = color.getGreen();
int b = color.getBlue();
pixels[i] = a << 24 | b << 16 | g << 8 | r;
}
return BufferUtils.toIntBuffer(pixels);
}
public static IntBuffer toIntBuffer(int[] elements) {
IntBuffer buffer = ByteBuffer.allocateDirect(elements.length << 2).order(ByteOrder.nativeOrder()).asIntBuffer();
buffer.put(elements).flip();
return buffer;
}
*编辑:传入参数的bufferedImage是从磁盘加载的
【问题讨论】:
-
那么你到底想做什么?您是从磁盘或网络加载图像,还是自己制作?
-
getRGB返回的值不是已经是打包的int值了吗?为什么需要转换它? (是的,它包括 alpha,否则Color(int, boolean)将无法工作......) -
我转换它的原因是因为我使用的是 OpenGL,它将像素数据读取为 ABGR 而不是 RGBA。
-
我也在从磁盘加载图像
-
从磁盘加载的最快方法是使用大的直接字节缓冲区。如果您正在加载实际图像(jpeg、png),在图像数据之前会有一个标题,并且尝试使用 IntBuffer 或其他东西将无法正常工作。
标签: java bufferedimage