2013-07-17 47 views
3

首先,即時通訊問這個具體的問題,因爲我已經閱讀了很多關於這個主題的例子,但沒有一個真的有幫助。轉換/顯示字節數組到bmp/jpeg圖像

我的問題是,我想轉換並顯示一個jpg圖像。我沒有原始圖像,它在服務器上。數據通過流(套接字)傳入,並以字節數組形式給出。在這個字節數組中,每4個字節代表一個像素的信息。我設法得到RGBs和轉換/保存到一個BMP圖像,但我找不到一個工作解決方案,使JPG。

另一方面,我有一個BMP :)如何顯示它在JLabel或JPanel?我也讀過imageou ImageIO等,但它不適合我。我使用ScheduleExecutorSystem btw。也許這是問題?

這裏的編碼器碼(版權(C)2013菲利普C.赫克爾):

public static void encodeToBitmap(byte[] srcBytes, OutputStream destStream) 
     throws IOException { 

    int imageWidth = 1024; 
    int imageHeight = 1080; 

    int imageBytes = imageWidth * imageHeight * 3; 
    int filesizeBytes = imageBytes + BMP_SIZE_HEADER; 

    byte[] header = BMP_HEADER.clone(); // Clone bitmap header template, and 
             // overwrite with fields 

    header = writeIntLE(header, BMP_OFFSET_FILESIZE_BYTES, filesizeBytes); 
    header = writeIntLE(header, BMP_OFFSET_IMAGE_WIDTH, imageWidth); 
    header = writeIntLE(header, BMP_OFFSET_IMAGE_HEIGHT, imageHeight); 
    header = writeIntLE(header, BMP_OFFSET_IMAGE_DATA_BYTES, 0); 
    header = writeIntLE(header, BMP_OFFSET_PAYLOAD_LENGTH, 
      (int) srcBytes.length); 

    // WRITE TO STREAM 

    // Add payload 

    destStream.write(header, 0, header.length); 

    for (int offset = imageBytes - imageWidth * 3; offset >= 0; offset -= imageWidth * 3) { 

     for (int i = 0; i < (imageWidth) * 3; i++) { 
      destStream.write(srcBytes[offset + i]); 
     } 
    } 

    destStream.close(); 
} 

和代碼,如何使用它:

BitmapEncoder.encodeToBitmap(RGBvalues, new FileOutputStream("path to file")); 
RGBvalues - bytes of 3, with the RGB values (i don't say!! :P) 

圖像的寬度和高度是修復調試目的

我有一個JPanel和一個JLabel,我添加了一個默認的ImageIcon JLabel(一個jpg圖像),它工作正常。 後,我保存的圖像,我嘗試:

ImageIcon icon = new ImageIcon("path to file"); 
pictureLabel.setIcon(icon); 

它只是使默認消失。我忘了設置什麼? 這是最快的方法嗎?

+0

爲什麼不分享你能夠將它轉換爲bmp的代碼段,使它更清楚你錯過了什麼地方? 你還試圖用JLabel或JPanel和BMP圖像。 –

+0

如果['ImageIO'](http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html)不適合你,那麼你一定不能有一個有效的位圖( BMP)圖像。數據來自哪裏?它是通過HTTP來傳遞的嗎?如果是這樣,標題可能會告訴你實際的格式。 – DaoWen

+0

不,它是TCP,並且可以從那裏讀取高寬信息,我在BMP中獲得了一個像樣的圖像 – bajla

回答

0

The ImageIcon class只支持讀取PNG,GIF和JPEG類型。您需要使用ImageIO將您的位圖讀取到一個通用的Image對象(,由ImageIcon支持),然後將其傳遞給ImageIcon。以下是我想修改代碼的工作:

File imgFile = new File("path to file"); 
Image image = javax.imageio.ImageIO.read(imgFile); 
ImageIcon icon = new ImageIcon(image); 
pictureLabel.setIcon(icon); 

請注意,您還可以使用ImageIO你的位圖轉換爲JPEG格式。

+0

是的,我在相關主題中看到了這個答案,事實證明,由於ScheduleExecutorService,我的代碼跳過了這一步,但現在沒關係了:)謝謝 – bajla