gpt4 book ai didi

java - 从 BufferedImage 中高效提取 RGBA 缓冲区

转载 作者:行者123 更新时间:2023-12-02 02:18:41 25 4
gpt4 key购买 nike

我一直在尝试将 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是从磁盘加载的

最佳答案

这是我的一些旧代码,可将图像转换为 LWJGL 的 OpenGL。由于必须交换字节顺序,因此将图像加载为整数是没有用的(我认为)。

   public static ByteBuffer decodePng( BufferedImage image )
throws IOException
{

int width = image.getWidth();
int height = image.getHeight();

// Load texture contents into a byte buffer
ByteBuffer buf = ByteBuffer.allocateDirect( 4 * width * height );

// decode image
// ARGB format to -> RGBA
for( int h = 0; h < height; h++ )
for( int w = 0; w < width; w++ ) {
int argb = image.getRGB( w, h );
buf.put( (byte) ( 0xFF & ( argb >> 16 ) ) );
buf.put( (byte) ( 0xFF & ( argb >> 8 ) ) );
buf.put( (byte) ( 0xFF & ( argb ) ) );
buf.put( (byte) ( 0xFF & ( argb >> 24 ) ) );
}
buf.flip();
return buf;
}

使用示例:

    BufferedImage image = ImageIO.read( getClass().getResourceAsStream(heightMapFile) );

int height = image.getHeight();
int width = image.getWidth();
ByteBuffer buf = TextureUtils.decodePng(image);

关于java - 从 BufferedImage 中高效提取 RGBA 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48875161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com