簡體   English   中英

寫入 5-5-5 RGB 並讀取 RGBA, BufferedImage

[英]Write in 5-5-5 RGB and read in RGBA, BufferedImage

我想做什么可以很快解釋。 讓我們考慮一個數字“x”。 我使用 TYPE_USHORT_555_RGB 對圖像進行操作。 我使用 setRGB(x),保存圖像。 不幸的是,Java 要求我通過 getRGB 讀取帶有 TYPE_INT_ARGB 的結果圖像。 我怎樣才能找到我的初始 x? 最讓我擔心的是,雖然通過 getRGB 讀取的一些數字在它們之間是相等的,但源代碼中不尊重這種等價模式,這就是我的意思:

閱讀:-16777216 -16777216 -16777216 -16777183 -16777117 -16777101 -16777093 -16777101

來源:00 00 00 20 66 74 79 70(十六進制)

讀取文件中位置 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){}

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 位(並返回)以進行檢索/存儲,這很慢並且可能會產生舍入/截斷錯誤。

但是,如果您不喜歡,則不需要使用此表示。 相反,您可以直接通過Raster / DataBuffer訪問“ ushort ”(Java沒有無符號整數類型,因此它們存儲為short s):

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 確實如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM