![](/img/trans.png)
[英]How to convert BufferedImage RGBA to BufferedImage RGB?
[英]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_RGB
或TYPE_INT_ARGB
模型,因為它們通常更容易使用(特別是如果你不喜歡擺弄的話)。
最后一個警告:並非所有文件格式都支持TYPE_USHORT_555_RGB
像素布局。 BMP 確實如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.