2013-07-22 65 views
1

我通過USB獲取10位像素(灰度)並將它們存儲在一個字節數組中。 因此,例如,第一個字節(imgData [0])包含第一個像素的前8位。第二個字節(imgData [1])包含第一個像素的最後2位和第二個像素的前6位等...JAVA/Jogl/OpenGL顯示10位imageData存儲在字節數組中

要獲得一個數組,其中每個索引代表1個像素,從的ByteArray成位集合和從所述位集合到一個整數陣列

位我只之前通過創建的ByteBuffer顯示的8位圖像作爲紋理:

private static ByteBuffer buffer; 

包裹它

buffer = ByteBuffer.wrap(imgData); 

和使用

gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, 1, 1280, 1024, 0, 
       GL2.GL_LUMINANCE, GL2.GL_UNSIGNED_BYTE, buffer); 

如果我需要使用10個數據,現在我可能需要使用IntBuffer和可以使用32位。但我只需要10位。我如何縮放/告訴OpenGl 1023的值意味着白色,值0意味着黑色?

或者:

有一種方法我可以輸入ImgData直爲ByteArray和OpenGL執行一些魔術和創建1個像素的是,被存儲在各ByteArray中10位的? 我看了一些關於glPixelStore,像素打包/解包等內容,但我無法弄清楚這是否真的能夠做我需要的東西以及如何使用它。

+0

我不知道openGL的能力,但我認爲它不能處理任何> 8位每通道。您可能需要刪除這兩個額外的位。 – zapl

回答

2

你不知道。

OpenGL的pixel transfer system無法處理非字節對齊的像素數據。你不能有一個10位像素的數組;每個像素必須在字節邊界上開始

此外,OpenGL也不能存儲這樣的像素數據;沒有GL_LUMINANCE10GL_R10image format。您可以將它存儲在GL_RGB10_A2格式中,但這仍然是一個問題,因爲

您可以做的最好的事情是預處理您的10位像素數組,將每個像素轉換爲32位RGB10_A2格式(複製10位,並將alpha設置爲full)。然後,您可以使用像素傳輸格式GL_RGBA和像素傳輸類型GL_UNSIGNED_INT_10_10_10_2(或者出於性能原因,可能是GL_UNSIGNED_INT_2_10_10_10_REV)進行上傳。不要忘記無符號整數的endian問題。

+0

好的,我做到了......感謝您的幫助!但是從我的字節數組轉換爲一個int數組是相當耗時的。 所以我想給它一個新的嘗試/方法,並設法接收我的數據如下: 每個像素現在開始在字節邊界。 imgData [0]是前8位,imgData [1]是最後2位。其他的是000000. 現在有辦法將這2個字節解釋爲一個16位顏色嗎?我試過\t \t gl.glTexImage2D(GL2.GL_TEXTURE_2D,0,GL2。GL_LUMINANCE16,1280,1024,0 \t \t \t \t \t \t GL2.GL_LUMINANCE,GL2.GL_UNSIGNED_BYTE,buffer); 但我做錯了,因爲我保持開始錯誤 – user1525814

+0

好吧,它現在似乎工作:)太棒了! – user1525814