2013-06-08 2 views
1

byte[]BufferedImage으로 변환하는 방법에 대한 몇 가지 예제를 확인했지만 제대로 작동하지 않는 것 같습니다. ImageByteArray를 BufferedImage로 변환합니다.

 BufferedImage b = null, c=null; 
     try { 
      b = ImageIO.read(Main.class.getResource("res/lvl/Medieval.png")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     byte[] imageByteArray = ((DataBufferByte) b.getRaster().getDataBuffer()).getData(); 

가 그럼 난 그것을 다시 변환하려고 : 난과 바이트 배열에 이미지를 변환

 ByteArrayInputStream bais = new ByteArrayInputStream(imageByteArray); 

     try { 
      c = ImageIO.read(bais); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

c 여전히이 후 null입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

나는이 문제가 글쓰기에 있다고 생각한다. – Azad

+0

흠 .. 여기에 당신의 의도가 조금 불분명하다고 생각합니다. 원시 픽셀 데이터에 대한 조작을 원하십니까? 그런 다음 데이터에서 새 이미지를 만들 필요가 없으며 변경 사항이 이미지에 반영됩니다. 또는 이미지의 사본을 만들고 싶습니까? – haraldK

+0

이미지를 복사하려는 경우 더 쉬운 방법이 있습니다. 또한 이미지가'DataBufferByte'를 사용하고 있다는 가정은 모든 이미지에 대해 올바르지 않을 것입니다. – haraldK

답변

2

귀하의 코드 라인

byte[] imageByteArray = ((DataBufferByte) b.getRaster().getDataBuffer()).getData(); 

이미지에 대한 유효한 바이트 배열을 만들지 않습니다. 이 코드 대신

사용 :

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ImageIO.write(b, "png", baos); 
    byte[] imageByteArray = baos.toByteArray(); 
+0

예! 그 트릭을 했어!감사합니다 – Limon

+0

나는 그것이 당신을 위해 일해서 기뻐요 - 대답을 받아 들일 것을 고려하십시오 : –

1

당신이 첫 번째 변환 후해야하는 것은 픽셀 데이터입니다. ImageIO (직렬화 된 형식으로 이미지를 읽을 수 있음)를 사용하는 대신 바이트 배열을 만들기 위해 수행 한 Oposite 변환을 시도하십시오.

DataBufferByte buffer = new DataBufferByte(bytes, bytes.length); 
    ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); 
    return new BufferedImage(cm, Raster.createInterleavedRaster(buffer, width, height, scanline, bpp, bandOffsets, null), false, null); 

그러나, 이미지가 첫 번째 이미지와 동일합니다, 그래서 당신이 여기 달성하기 위해 무엇을하려고하는 정말 모르겠어요 .. :

은 일반적으로 다음과 같이 somethig에?

추신 : 명시 적으로하지 않는 한 이미지 바이트 배열이 복제되지 않으므로 이미지가 픽셀 데이터를 공유합니다.

+0

내가 원하는 것은 바이트 배열로 변환하여 소켓을 통해 보내고 다른 끝에서 다시 어셈블하도록 base64로 인코딩 할 수 있도록하는 것입니다. 그래서 그 똑같은 이미지. – Limon

0

문제는 바이트 코드에서 이미지를 검색하지 않고 이미지를 픽셀 단위로 작성해야한다는 것입니다.
이미지를 바이트 배열로 바꾼 짧은 방법에 관심이 있었지만 불행히도 첫 번째 오류는 실패합니다.

  • 를 예를 들어 ImageConversation 또는 이름에 대한 자신의 클래스 이름을 만들기 : 당신은 당신을 도울 것입니다 위해
    아마이 방법을 나는했다.
  • 모든 대화 (byte [] 이미지 또는 image bye [])를 클래스 이름으로 호출 할 수 있도록 정적으로 만듭니다.

은 선택한 파일 형식 FileChooser 또는 주어진 파일을 변환하고 바이트 []로 변환됩니다 그러나이 방법은 조금 길어 그리고 그것은 가장 좋은 방법이 될 수없는, 그러나 그것은을 제공합니다 좋은 결과와 나는 그것에 관한 어떤 문제도 가지지 않고있다.

 public static byte [] imageToBytoArray(File file){ 

     ByteArrayOutputStream byteArray; 
     try{ 
      FileInputStream fileStream = new FileInputStream(file); 
      byteArray = new ByteArrayOutputStream(); 
      byte [] buffer = new byte [1024]; 
      for(int i ;(i=fileStream.read(buffer)) !=-1;){ 
       byteArray.write(buffer, 0, i); 
      } 
      return byteArray.toByteArray(); 

     }catch(Exception ex){ 
      JOptionPane.showMessageDialog(null, ex.getMessage()); 
     } 
     return null; 
    } 
관련 문제