用5-5-5 RGB写入并读入RGBA,BufferedImage

时间:2016-03-08 18:57:26

标签: java image rgb bufferedimage

我想要做的事情很快就会解释。我们考虑一个数字" x"。我使用TYPE_USHORT_555_RGB操作图像。我使用setRGB(x),保存图像。不幸的是,Java要求我通过getRGB用TYPE_INT_ARGB读取生成的图像。我怎样才能找到我的初始x? 让我最担心的是,虽然通过getRGB读取的一些数字在它们之间是相等的,但这种等价模式在源代码中并未得到尊重,这就是我的意思:

READ: -16777216 -16777216 -16777216 -16777183 -16777117 -16777101 -16777093 -16777101

来源: 00 00 00 20 66 74 79 70(HEX)

位置6和8中的数字在读取文件中相等,但在源文件中不同(74!= 70)

//Write part:
BufferedImage img=new BufferedImage(8, 1, BufferedImage.TYPE_USHORT_555_RGB);
      for(int q=0;q<8;q++)
          img.setRGB(q,0,realVal[q]);//realVal contains the hex values
  File f= new File("randomfile.bmp");
  ImageIO.write(img, "bmp", f);

//Read part:
BufferedImage img;
        try{
        img=ImageIO.read(new File("randomfile.bmp"));
        for(int q=0;q<8;q++)
            System.out.println(img.getRGB(q,0));
        }catch(Exception e){}

1 个答案:

答案 0 :(得分:0)

BufferedImage.TYPE_USHORT_555_RGB类型使用15位(或16位,但不使用第16位)表示像素,其中每个R,G和B样本使用5位。

另一方面,BufferedImage.getRGB(...)方法是便捷方法,用于获取/设置单个或一组像素的颜色,并始终在打包的32位ARGB表示上运行,其中每个A,R,G和B样本使用8位(颜色模型总是sRGB),就像你说的TYPE_INT_ARGB一样。由于表示的这种差异,需要将5比特样本“缩放”到8比特(并且返回)以用于检索/存储,这很慢并且可能产生舍入/截断错误。

但是,如果您不喜欢,则不需要使用此表示法。相反,您可以通过ushort / short直接访问“Raster”(Java没有无符号整数类型,因此它们存储为DataBuffer): / p>

DataBufferUShort dataBuffer = (DataBufferUShort) image.getRaster().getDataBuffer();
short[] data = dataBuffer.getData(); // Get the backing array

对支持数组的任何更改都将反映在图像中(它是“实时”视图)。此外,访问后备阵列很可能会禁用任何硬件加速的机会,但这可能不是问题(它不在您发布的代码中,因为它只读取/写入图像,没有显示)。

那就是说,你应该考虑@ gpasch的评论,看看你是否可以使用TYPE_INT_RGBTYPE_INT_ARGB模型,因为它们通常更容易使用(特别是如果你不喜欢的话)有点笨拙)。

最后警告:并非所有文件格式都支持TYPE_USHORT_555_RGB像素布局。但BMP确实如此。