2016-03-08 82 views
-1

我想要做的事情可以很快解釋。我們來考慮一個數字「x」。我使用TYPE_USHORT_555_RGB對圖像進行操作。我使用setRGB(x),保存圖像。不幸的是,Java有義務通過getRGB使用TYPE_INT_ARGB讀取生成的圖像。我怎樣才能找到我的初始x? 我什麼擔心的最多的是,雖然通過閱讀的getRGB一些數字是他們之間的平等,等價的這種模式是不是在源推崇,這裏就是我的意思:寫入5-5-5 RGB並讀入RGBA,BufferedImage

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

SOURCE: 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){} 
+0

你的十六進制值可能是紅綠藍;放下一些代碼,並會看到你在做什麼 – gpasch

+1

555_RGB是一個非常複雜的模型,它幾乎可以肯定會扭曲值 - 如果你真的需要這個值,你需要得到方程 - 爲什麼你需要555?你不能使用普通的RGB?你希望用這個圖像做什麼樣的處理 - 你也可以使用數組 – gpasch

+0

剛剛意識到來自源的十六進制值拼寫「ftyp」。你確定這是你的像素值嗎?或者你是否在十六進制編輯器中查看*文件*,期望文件的字節等於圖像中的像素值? – haraldK

回答

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」(Java沒有無符號整型,所以它們被存儲爲short S)直接通過Raster/DataBuffer

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雖然。

+0

我可以使用的其他模型是TYPE_BYTE_INDEXED和TYPE_BYTE_GRAY,我會嘗試這些。 – Christian

+0

@Christian重點不在於避免使用'TYPE_USHORT_555_RGB',而是'TYPE_INT_RGB'和'TYPE_INT_ARGB'是唯一可以依賴'getRGB(...)'方法返回相同值的設置'setRGB(...)'。在這方面使用'TYPE_BYTE_INDEXED'或'TYPE_BYTE_GRAY'將不會有幫助。這可能有助於我們理解問題,如果您陳述*爲什麼*您需要使用這些「特殊」類型? – haraldK

+0

原因很簡單,我想了解爲什麼JavaDoc說TYPE_BYTE_INDEXED和TYPE_BYTE_GRAY是1字節編碼,但是當我嘗試使用q從0到255執行putRGB(q,0,q)時,我用繪製並讀取rgb,我注意到很多像素都是圓形的,所以從0到20(例如)(如int rgb)我得到相同的像素。這意味着這些編碼不使用1個字節,但Java說的是,我很困惑。 – Christian