32位灰度BufferedImage?

时间:2011-11-01 18:12:28

标签: java awt bufferedimage

我有一个字节数组对应于数据类型unsigned short的像素值(由C ++应用程序编写)。我需要将这些值转换为BufferedImage并显示或保存它。

我正在使用以下循环:

    int xsize=1024;
    int ysize=1024;

        for (int i = 0; i < bandCount; i++) 
        {
            ints[i]=new int[pixels];
            for(int j=0;j<pixels*2;j+=2)
            {

                short temp=bands[i].getShort(index);

                ints[i][index]=(temp&0xffff);
                index++;
            }
        }
        imgBuffer = new DataBufferInt(ints, pixels);
        buffer_type = DataBuffer.TYPE_INT;
        sampleModel = new BandedSampleModel(buffer_type, xsize, ysize,
                xsize, banks, offsets);
        data_type = BufferedImage.TYPE_USHORT_GRAY;

    }
    WritableRaster raster = Raster.createWritableRaster(sampleModel,
            imgBuffer, null);
    BufferedImage img = new BufferedImage(xsize, ysize, data_type);
    img.setData(raster);

其中像素只是图像的宽度*高度。 bands []是包含像素值的ByteBuffer。我在下一个简短的内容中读取它,并将其转换为int值,并在循环之后,创建这些int值的DataBuffer。    然后我尝试从转换的像素值创建BandedSampleModel。 DataBuffer类型是INT(我认为),BufferedImage设置为USHORT_GRAY。

我认为图像看起来很可怕 - 它正在跳过其他所有像素。我已经尝试更改BufferedImage类型(上面的data_type),但是没有32位灰度选项。我尝试过使用TYPE_INT_ARGB并得到一个异常,说明BufferedImage上的setData正在使用越界索引(1024)。图像远大于1024x1024;我将xsize和ysize锁定到这些值,以减少产生错误所花费的时间。

我有点超出我的深度;如何使用无符号短像素值数组创建BufferedImage?我是否在循环中错误地读取了像素值,或者我只是错误地设置了DataBuffer或BufferedImage类型?

谢谢!

1 个答案:

答案 0 :(得分:1)

我会使用ImageJ&gt; Import&gt; Raw…,正确处理unsigned short。它也有一个方便的宏观设施。

附录:使用ImageJ的一个便利是它将输入中存在的无符号短值范围映射到256 RGB灰度值的均匀间隔调色板。您可以通过导入原始图像并选择Analyze&gt;来查看效果。 Histogram。当然,您可以使用Image&gt;应用任何所需的LUT。 Lookup Tables