2012-04-21 3 views
0

IplImage를 Image로 변환하고 JPanel에 그릴 수 있기 때문에 이미지가 유효하다는 것을 알고 있습니다. 하지만 바이트 배열을 이미지로 변환 할 때 대부분의 경우 이미지에 대한 null 참조를 얻습니다. 아래에서이 코드를 보면서 내가 직면 한 것과 그림, 의견, 질문, 답변을 모두 환영하며 팁도 환영합니다.ImageIO.read가 때때로 100 % 유효 함에도 불구하고 null을 반환합니다.

  Image i = Convert.getImage(image); 
      byte[] buffer = Convert.getBytes(image); 
      Image i2 = Convert.getImage(buffer); 
      //i2 is a null reference and i is a valid image. i can be drawn but i2 is useless. 

변환 클래스 : 나는 바이트 배열로 필요 왜

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package Security; 

import com.googlecode.javacv.cpp.opencv_core.IplImage; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferByte; 
import java.io.ByteArrayInputStream; 
import javax.imageio.ImageIO; 
import javax.imageio.ImageReader; 

/** 
* 
* @author danny 
*/ 
public final class Convert 
{ 

     public static Image getImage(IplImage image) 
     { 
       return image.getBufferedImage(); 
     } 

     public static byte[] getBytes(IplImage image) 
     { 
       byte[] buffer; 
       BufferedImage bI = image.getBufferedImage(); 
       buffer = ((DataBufferByte) (bI).getRaster().getDataBuffer()).getData(); 
       return buffer; 
     } 

     public static String getString(byte[] buffer) 
     { 
       return new String(buffer); 
     } 
     public static Image getImage(byte[] buffer) 
     { 
       try 
       { 

         Image i = ImageIO.read(new ByteArrayInputStream(buffer)); 
         return i; 
       } 
       catch (Exception e) 
       { 
         System.out.printf("Exception Message:\n%s", e.getMessage()); 
         return null; 
       } 

     } 
} 

이제 중 일부는 요청할 수 있습니다. 네트워크를 통해 전송해야하기 때문에.

추가 상황이 알아야 할 :

내가 사용 시도 : 예외가

  • IplImage을 던져되고 있지

    이 업데이트 유효한 객체에게 있습니다 ToolKit 클래스는, 바이트 배열로부터 이미지를 생성합니다. 그러나 그것은 JPEG 또는 GIF가 아니기 때문에 아마도 실패합니다. 유효한 Image 객체를 반환하더라도 이미지 객체는 비어있는 이미지를 가리 킵니다. 다음은 사용하려고 시도했지만 그렇게하지 못한 코드입니다.

    public static Image getImage(byte[] buffer) 
    { 
         try 
         { 
           Toolkit toolkit = Toolkit.getDefaultToolkit(); 
           Image i = toolkit.createImage(buffer); 
           return i; 
         } 
         catch (Exception e) 
         { 
           System.out.printf("Exception Message:\n%s", e.getMessage()); 
           return null; 
         } 
    
    } 
    
  • +0

    거기에 '예외'가 있습니다. 어떤 행운을 잡는거야? 아무것도 인쇄합니까? –

    +0

    예외가 발생하지 않습니다. 나는 아마 그것을 언급하는 것을 잊었다. –

    +0

    'getString'은 어디에서나 작동하지 않습니다. OS 인코딩을 사용하고, UTF-8에서 깨고, String에 몇 가지 문제가 있습니다 (nul, lineendings). –

    답변

    2

    DataBufferByte.getData 것이다 ". (최초의) 바이트 데이터 배열의 기본을 돌려줍니다" 첫 번째 은행입니다. 바이트를 가져 오는 불확실하고 불완전한 방법 인 것 같습니다. 특히 돌아 오는 길에. 게다가, DataBuffer로부터 DataBufferByte에 캐스트에 의존하는 캐스트가 있습니다.

    ImageIO는 OutputStream에 쓸 수 있습니다. 예를 들어 바이트를 사용할 수있는 ByteArrayOutputStream에 쓸 수 있습니다. 그리고 다른면에서 ImageIO가 다시 읽을 수 있습니다. 그건 당신이 염두에두고있는 순수한 픽셀 데이터가 아니라 바보 같은 것입니다.

    +0

    이것을 읽기 전에 이미 해결했습니다. 답해 주셔서 감사합니다. getBytes (IplImage)가 잘못된 바이트 배열을 반환했기 때문에 실제로 해결했습니다. 그래서 저는 ImageIO.write를 답안에서 언급 한 것처럼 사용했습니다. 네가 나를 돕는 데 너무 좋았 기 때문에 너를 대답으로 표시 할 것이다. 도와 주신 모든 분들께 감사드립니다! :) –

    관련 문제