首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javax.imageio.IIOException:不是JPEG流(以: 0x0003开头,预期SOI: 0xffd 8)

javax.imageio.IIOException:不是JPEG流(以: 0x0003开头,预期SOI: 0xffd 8)
EN

Stack Overflow用户
提问于 2017-08-22 09:52:55
回答 1查看 213关注 0票数 0

在将inputStream转换为bufferImage时遇到问题。BufferedImage crfPersonImg始终为空,异常发生在行栅格= reader1.readRaster(0,null);到目前为止,这是我的代码

代码语言:javascript
复制
//code for getting ByteArray From Blob column in Oracle DB.
    List<Object[]> userRoleList = commonDao.findByNativeSQL(selectSQL
            , new Object[] {examCd, examPeriod, fromMemNo, toMemNo});
    for(Object[] row : userRoleList){
        CertificateDtlsVO cdObj = new CertificateDtlsVO();          
        cdObj.setExmCd(Integer.parseInt(row[0].toString()));
        cdObj.setExmDsc(row[1].toString());
        cdObj.setMemNo(row[2].toString());
        cdObj.setMemNm(row[3].toString());
        cdObj.setCertNo(row[4].toString());
        cdObj.setCertDt(row[5].toString());
        cdObj.setPrtNo(row[6].toString());
        cdObj.setSylCd(row[7].toString());
        cdObj.setNumOfTime(Integer.parseInt(row[8].toString()));
        cdObj.setMemType(row[9].toString());
        cdObj.setClassGrade(row[10].toString());

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(row[11]);           
        cdObj.setPhoto(baos.toByteArray());
        baos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(baos);
        oos.writeObject(row[12]);
        cdObj.setSign(baos.toByteArray());
        cdObj.setPhotoBuffImg(ImageIO.read(new ByteArrayInputStream(baos.toByteArray())));
        oos.flush();
        oos.close();
        memCertfDtlsList.add(cdObj);
    }

//字节数组转换为BufferImage的代码

代码语言:javascript
复制
InputStream in = new ByteArrayInputStream(photo);       
    Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("JPEG");
    ImageReader reader1 = null;
    while (readers.hasNext()) {
        reader1 = readers.next();
        if (reader1.canReadRaster()) {
            break;
        }
    }

    //Stream the image file
    ImageInputStream input =   ImageIO.createImageInputStream(in); 
    reader1.setInput(input); 

    //Read the image raster
    Raster raster = reader1.readRaster(0, null); 

    //Create a new RGB image
    BufferedImage bi = new BufferedImage(raster.getWidth(), raster.getHeight(), 
            BufferedImage.TYPE_4BYTE_ABGR); 

    //Fill the new image with the old raster
    bi.getRaster().setRect(raster);

    BufferedImage crfPersonImg = ImageIO.read(in);

com.twelvemonkeys.imageio.plugins.jpeg.JPEGSegmentImageInputStream.streamInit(JPEGSegmentImageInputStream.java:247) at com.twelvemonkeys.imageio.plugins.jpeg.JPEGSegmentImageInputStream.fetchSegment(JPEGSegmentImageInputStream.java:71) at com.twelvemonkeys.imageio.plugins.jpeg.JPEGSegmentImageInputStream.repositionAsNecessary(JPEGSegmentImageInputStream.java:267)上的javax.imageio.IIOException:不是JPEG流(以: 0x0003开头,预期SOI: 0xffd 8)

样本图像

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-22 12:40:27

感谢@haraldK,通过更改从blob列获取字节数组的代码来解决我的问题。

代码语言:javascript
复制
List<Object[]> userRoleList = commonDao.findByNativeSQL(selectSQL
            , new Object[] {examCd, examPeriod, fromMemNo, toMemNo});
    for(Object[] row : userRoleList){
        CertificateDtlsVO cdObj = new CertificateDtlsVO();          
        cdObj.setExmCd(Integer.parseInt(row[0].toString()));
        cdObj.setExmDsc(row[1].toString());
        cdObj.setMemNo(row[2].toString());
        cdObj.setMemNm(row[3].toString());
        cdObj.setCertNo(row[4].toString());
        cdObj.setCertDt(row[5].toString());
        cdObj.setPrtNo(row[6].toString());
        cdObj.setSylCd(row[7].toString());
        cdObj.setNumOfTime(Integer.parseInt(row[8].toString()));
        cdObj.setMemType(row[9].toString());
        cdObj.setClassGrade(row[10].toString());
        InputStream photoBlob = ((Blob) row[11]).getBinaryStream();
        InputStream signBlob = ((Blob) row[12]).getBinaryStream();
        cdObj.setPhoto(IOUtils.toByteArray(photoBlob));
        cdObj.setSign(IOUtils.toByteArray(signBlob));
        memCertfDtlsList.add(cdObj);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45814398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档