2015-01-02 8 views
0

바이트가 []로로드 된 이미지가있어서 jpeg 이미지로 저장해야합니다. 나는 그것을 저장하려고 시도했지만, 나는 나에게 IllegalArgumentException을 준다.바이트 배열에서 이미지 throw IllegalArgumentException

private String saveProcessedImage(byte[] imageInBytes, String surface) throws IOException { 

    String savePath = imageSavePath+"\\"+surface+"-"+ UUID.randomUUID()+".jpg"; 

    InputStream in = new ByteArrayInputStream(imageInBytes); 
    BufferedImage img = ImageIO.read(in); 
    ImageIO.write(img,"jpg",new File(savePath)); 
    img.flush(); 
    in.close(); 
    return savePath; 
} 

스택 추적 :이 ImageIO.write 호출 될 때 여기에 주목 무엇

Exception in thread "main" java.lang.IllegalArgumentException: image == null! 
    at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925) 
    at javax.imageio.ImageIO.getWriter(ImageIO.java:1591) 
    at javax.imageio.ImageIO.write(ImageIO.java:1520) 
    at com.abc.def.agent.imaging.ImageProcessJobBroker.saveProcessedImage(ImageProcessJobBroker.java:80) 
    at com.abc.def.agent.imaging.ImageProcessJobBroker.processFrontAndBack(ImageProcessJobBroker.java:48) 
    at com.abc.def.agent.imaging.TestBroker.main(TestBroker.java:9) 

이 BuffredImage img이다가 null() 바이트 []과의 InputStream in이 존재하더라도. 상기 saveProcessedImage에

() 메소드의 호출 :

public byte[] getProcessedBinaryImage(String filePath) throws IOException { 
     File imagePath = new File(filePath); 
     BufferedImage bufImg = ImageIO.read(imagePath); 
     WritableRaster raster = bufImg.getRaster(); 
     DataBufferByte imgdata = (DataBufferByte) raster.getDataBuffer(); 
     ComponentSampleModel csm = (ComponentSampleModel) raster.getSampleModel(); 

     ZvImage zvSrcImg = new ZvImage(); 
     ZvImage zvDestImg = new ZvImage(); 
     zvSrcImg.width = bufImg.getWidth(); 
     zvSrcImg.height = bufImg.getHeight(); 
     zvSrcImg.bpp = 24; 
     zvSrcImg.stride = csm.getScanlineStride(); 
     zvSrcImg.data = imgdata.getData(); 
     String[] msg = new String[1]; 

     int status = GetProcessedBinaryImage(zvSrcImg, zvDestImg, msg, true); 


     if ((zvDestImg.nativeData != null) && (0 == status)) return zvDestImg.nativeData; 
     return null; 
    } 

: 진 호출을 수행

public native int GetProcessedBinaryImage(ZvImage srcImage, ZvImage dest, String[] errorMsg, boolean isFront); 

있어서

여기
frontImagePath = saveProcessedImage(jniImageProcAgent.getProcessedBinaryImage(frontImageFileName), "front"); 

메소드의 JNI 서명 인 데이터 전송에 사용 된 ZvImage d :

public class ZvImage { 
     public int width; 
     public int height; 
     public int bpp; 
     public int stride; 
     public byte[] data; 
     public byte[] nativeData; 

     public void setNativeData(byte[] nativeData) { 
      this.nativeData = nativeData; 
     } 

     public byte[] getData() { 
      return data; 
     } 
    } 

여기에 내가 뭘 잘못하고 있니? 지원에 감사드립니다.

+0

어떻게하면 'imageInBytes'에 바이트를로드합니까? – ortis

+1

ImageIO.read() 메서드 사양에 따르면 "등록 된 ImageReader가 결과 스트림을 읽을 수 있다고 주장하지 않으면 null이 반환됩니다." - http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html#read(javax.imageio.stream.ImageInputStream) – Divers

+0

@ortis : imageInBytes가 JNI 호출을 통해로드됩니다. – helloworld

답변

0

바이트 []에 문제가 없었습니다. 이미지를 만든 방식에 문제가있어서 매개 변수를 변경하고 JNI 메서드가 호출 된 메서드에서 반환했습니다.

//region -- Code stub to create the buffered image -- 
     BufferedImage result = new BufferedImage(zvDestImg.width, zvDestImg.height, BufferedImage.TYPE_BYTE_GRAY); 
     DataBuffer buffer = new DataBufferByte(zvDestImg.nativeData, zvDestImg.nativeData.length); 
     SampleModel sampleModel = new ComponentSampleModel(DataBuffer.TYPE_BYTE, zvDestImg.width, zvDestImg.height, 1, zvDestImg.stride, new int[]{0}); 
     Raster raster2 = Raster.createRaster(sampleModel, buffer, null); 
     result.setData(raster2); 
     //endregion