【问题标题】:byte array to Image throw IllegalArgumentException字节数组到图像抛出 IllegalArgumentException
【发布时间】:2015-01-02 09:28:49
【问题描述】:

我有一个加载为 byte[] 的图像,我需要将其保存为 jpeg 图像。我试图保存它,但我给了我一个 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;
}

堆栈跟踪:

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 在调用 ImageIO.write() 时为空,即使存在 byte[] 和 InputStream in

调用上面的saveProcessedImage()方法:

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

这是该方法的 JNI 签名:

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

jin 调用的方法:

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;
    }

ZvImage dto用来传输数据:

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 中?
  • 根据 ImageIO.read() 方法规范“如果没有注册的 ImageReader 声称能够读取结果流,则返回 null。” - docs.oracle.com/javase/7/docs/api/javax/imageio/…
  • @ortis : imageInBytes 正在通过 JNI 调用加载
  • @Divers :谢谢,但我对此有点困惑
  • 显示是加载字节的代码。这里可能有问题。为什么要使用 JNI 顺便说一句?

标签: java bufferedimage javax.imageio


【解决方案1】:

byte[] 没有问题,问题在于我创建图像的方式,我更改了参数并从调用 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

【讨论】:

    猜你喜欢
    • 2020-07-03
    • 2012-07-28
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多