2013-07-17 2 views
3

우선이 주제에 관해 많은 예제를 읽었으므로 우선이 특정 질문을하고 있지만 실제로 도움이되지는 못합니다.바이트 배열을 bmp/​​jpeg 이미지로 변환/디스플레이

내 문제는 내가 변환하고 jpg 이미지를 표시하고 싶습니다. 원본 이미지가 없습니다. 서버에 있습니다. 데이터는 스트림 (소켓)을 통해 전달되며 바이트 배열로 제공됩니다. 이 바이트 배열에서 모든 4 바이트는 픽셀에 대한 정보를 나타냅니다. 나는 RGB를 가져 와서 bmp 이미지로 변환/저장했지만, jpg를 만드는 작업 솔루션을 찾을 수 없었습니다.

반면에 BMP가 있습니다. 어떻게 JLabel 또는 JPanel에서 표시 할 수 있습니까? 나는 또한 abou imageicon 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을 가지고 있으며, JLabel에 기본 ImageIcon을 추가했습니다 (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으로 전달해야합니다. 여기에 내가 당신의 코드가 작동을 수정하는 것입니다 방법은 다음과 같습니다 당신은 또한 ImageIO을 사용할 수 있습니다

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

참고 JPEG 형식으로 비트 맵을 변환 할 수 있습니다.

+0

네, 관련 주제에서이 답변을 보았습니다, 내 코드는 ScheduleExecutorService 때문에이 단계를 건너 뛰었습니다. 그러나 이제는 괜찮습니다. :) 감사합니다. – bajla

관련 문제