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;
}
}
여기에 내가 뭘 잘못하고 있니? 지원에 감사드립니다.
어떻게하면 'imageInBytes'에 바이트를로드합니까? – ortis
ImageIO.read() 메서드 사양에 따르면 "등록 된 ImageReader가 결과 스트림을 읽을 수 있다고 주장하지 않으면 null이 반환됩니다." - http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html#read(javax.imageio.stream.ImageInputStream) – Divers
@ortis : imageInBytes가 JNI 호출을 통해로드됩니다. – helloworld