java - 从 float 组创建图像,索引超出范围

标签 java javax.imageio

为什么这个方法会抛出索引越界错误?尝试根据我自己生成的数据创建图像,我希望这会奏效。

private BufferedImage getImageFromFloatArray(float[] data, int w, int h) {
    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    System.out.println("Image pixel array size: "
                    + ((DataBufferInt) img.getRaster().getDataBuffer())
                            .getData().length);
    System.out.println("Datasize: " + data.length);
    WritableRaster raster = img.getRaster();
    raster.setPixels(0, 0, w, h, data);
    return img;
}

堆栈跟踪

Image pixel array size: 800000
Datasize: 800000
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 800000
    at java.awt.image.SampleModel.setPixels(Unknown Source)
    at java.awt.image.WritableRaster.setPixels(Unknown Source)
    at image.PixelAraryToImageTest.getImageFromFloatArray(PixelAraryToImageTest.java:36)

最佳答案

尝试使用 Raster 宽度和高度变量而不是 BufferedImage 宽度和高度变量。同时使用 Raster.getMinX()Raster.getMinY()

float 组中的每个值都不是像素值。每个值都是一个颜色分量值。所以 2x1 图像实际上需要长度为 4,因为您有 ARGB 颜色分量。例如,要使其成为红色的 2x1 图像,需要类似...

int numColorComponents = 4;
float[] data = new float[imgWidth*imgHeight*numColorComponents];
raster.setPixels(minX,minY, rasterWidth,rasterHeight, data);

此外,与其他图形框架不同,这里的浮点缓冲区不是规范化值的缓冲区。它的值在 [0, 255] 之间。因此,要将 2x1 图像设置为不透明的红色,您的缓冲区将是:

float alpha = 255;
float red = 255;   
float[] buffer = new float[]{alpha,red,0,0,alpha,red,0,0};

关于java - 从 float 组创建图像,索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17955868/

相关文章:

Java .vs. C# 内存使用和性能

java - 如何编写正则表达式来查找以下模式?

java - 如何获取图像(在文件中)的 channel 数(颜色深度)?

java - TIFFPackBitsCompressor - NPE?

java - 有没有办法让Intellij在我刚刚提取参数时用方法替换重复代码?

java - 什么是 | Java 中的运算符在做什么?

java - Java 中有 long double 的替代品吗?

java - png 文件压缩为 jpeg 时变成全黑。是因为PNG是无损的吗?

Java:从 res 文件夹加载 BufferedImage

java - ImageIO.readImage IIOException 虽然我可以在 Chrome 中打开它