2012-05-23 55 views
3

我正在使用JNA。我從我的C++方法獲取原始數據的字節數組。 現在我堅持如何在java中使用這個原始數據字節數組獲取緩衝圖像。 我曾嘗試過很多東西來獲得它作爲tiff圖像,但我力爭取得成功。 這是我到目前爲止的代碼。 這裏我的字節數組包含16位灰度圖像的數據。我從x傳感器設備獲取這些數據。現在我需要從這個字節數組中獲取圖像。從原始數據的字節數組中獲取緩衝圖像

第一次嘗試

byte[] byteArray = myVar1.getByteArray(0, 3318000);//array of raw data 

      ImageInputStream stream1=ImageIO.createImageInputStream(newByteArrayInputStream(byteArray)); 
      ByteArraySeekableStream stream=new ByteArraySeekableStream(byteArray,0,3318000); 
       BufferedImage bi = ImageIO.read(stream); 

第二次嘗試

 SeekableStream stream = new ByteArraySeekableStream(byteArray); 
     String[] names = ImageCodec.getDecoderNames(stream); 


      ImageDecoder dec = ImageCodec.createImageDecoder(names[0], stream, null); 
//at this line get the error ArrayIndexOutOfBoundsException: 0 
      RenderedImage im = dec.decodeAsRenderedImage(); 

我想我在這裏失蹤。 由於我的數組包含原始數據,因此它不包含tiff圖像的標題。 m我對不對? 如果是,那麼如何在字節數組中提供這個頭。並最終如何從這個字節數組中獲取圖像?

測試我從我的本地方法得到正確的字節數組我將這個字節數組存儲爲.raw文件,並在ImageJ軟件中打開這個原始文件後,它播種正確的圖像,所以我的原始數據是正確的。 我唯一需要的是如何轉換我的原始字節數組圖像字節數組?

+1

我能夠通過鏈接 轉換爲圖像的原始字節數組https://forums.oracle.com/forums/thread.jspa?threadID=1261950(我必須將字節偏移量轉換爲{3, 2,1,0},正如論壇中對bandOffset和光柵所建議的那樣 – thakare

回答

3

無論字節數組是否包含像素數據或像TIFF等結構化圖像文件真的取決於您從哪裏得到它。從提供的信息中回答這個問題是不可能的。

但是,如果它確實包含結構化圖像文件,那麼你可以一般:

  • 環繞它一個ByteArrayInputStream
  • 通串流播放ImageIO.read()

如果你只需要原始的像素數據,那麼你有幾個主要選項:

  • '手動'ge t的像素數據,以便它在int數組中,每個像素具有一個int形式的ARGB格式(ByteBuffer和IntBuffer類可以幫助您與字節混合)
  • 創建一個空白的BufferedImage,然後調用其setRGB()方法設置您以前準備好的int數組中的實際像素內容

我認爲如果您知道您對位和字節所做的操作,上述操作最容易。然而,在原則上,你應該能夠做到以下幾點:將創建一個在你的數據包

  • 通的WritableRaster對象的WritableRaster到相關

    • 找到一個合適的WritableRaster.create ...方法方法BufferedImage構造函數來創建你的圖像。
  • +0

    那麼我是從natve方法和我的X射線傳感器設備的數據創建我的原始字節數組n它包含16位的原始數據灰度圖像,正如我所說,將該數組存儲爲.raw文件並在imageJ中打開這個.raw文件給了我正確的X射線圖像 – Jony

    5

    這是我用來將原始像素數據轉換爲BufferedImage。我的像素被簽名爲16位:

    public static BufferedImage short2Buffered(short[] pixels, int width, int height) throws IllegalArgumentException { 
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_USHORT_GRAY); 
        short[] imgData = ((DataBufferShort)image.getRaster().getDataBuffer()).getData(); 
        System.arraycopy(pixels, 0, imgData, 0, pixels.length);  
        return image; 
    } 
    

    然後我使用JAI編碼生成的圖像。告訴我你是否還需要代碼。

    編輯:我已經大大提高了速度感謝@Brent Nash answer對類似的問題。

    +0

    它給了我一個圖像,但我認爲這個圖像的字節順序是不正確的。 – Jony

    +1

    要完成任何字節操作?我還沒有編寫這個函數,因爲我和'byte []'有相同的內容,並且有一天最終需要和'short []'一樣的。「 然而,Java是大型的,如果你使用的是Windows,那麼你接收到的流可能是小小的,你必須讓自己變成轉換。 檢查'java.nio.ByteOrder.nativeOrder()'知道哪一個是本地的字節順序(如果你想保持你的代碼交叉平臺)。 – Matthieu

    +0

    可否請您提供字節數組輸入的方法? –

    相關問題