Java将byte []转换为图像

min*_*gle 3 java sql playframework javax.imageio

我知道这似乎是一个常见的问题,但我在互联网上四处浏览,并尝试了许多不同的教程和方法来执行此操作。我想我很近,但不确定。我也正在使用Play Framework,但对于Java应该是相同的。这是我的错误

javax.image.IIOException: I/O error reading PNG header!
   at com.sun.plugins.png.PNGImageReader.readHeader(Unknown Source)
   ...
   ...
Caused by: java.io.EOFException
at javax.imageio.stream.ImageInputStreamImpl.readFully(Unknown Source)
  ...
Run Code Online (Sandbox Code Playgroud)

这是我的代码,在其中我从表单中获取图片并将图像转换为byte []并存储在MS SQL db中。

@Transactional
public static Result submitTrailer(){
     filledForm = newTrailerForm.bindFromRequest();
     MultipartFormData body = request().body().asMultipartFormData();
     FilePart picture = body.getFile("file");
     String fileName = picture.getFilename();
     System.out.println(fileName);
     String contentType = picture.getContentType(); 
     System.out.println(contentType);
     final File file = picture.getFile();
     filledForm.get().setContentType(contentType);

     try{
     BufferedImage originalImage = ImageIO.read(file);
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     ImageIO.write(originalImage, contentType, baos);

     filledForm.get().setImage(baos.toByteArray());
     baos.flush();
     baos.close();
     filledForm.get().save();
     }catch(IOException e){
         e.printStackTrace();
     }

    return ok(views.html.index.index.render());
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试将byte []隐藏回图像的位置,因此我可以将其显示为html

public File getConvertedPicture(){
    File imageFile;
    System.out.println("byteToImage() called");
    if(getImage()==null){
        System.out.println("getByteImage()==null");
        return null;

    }else{
        try{
        ByteArrayInputStream bis = new ByteArrayInputStream(getImage());
        imageFile=File.createTempFile("pattern", ".suffix");

        Iterator<?> readers = ImageIO.getImageReadersByFormatName("PNG");


        ImageReader reader = (ImageReader) readers.next();
         Object source = bis;
         ImageInputStream iis = ImageIO.createImageInputStream(source);
         reader.setInput(iis, true);
            ImageReadParam param = reader.getDefaultReadParam();

            Image image = reader.read(0, param);
            BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
            Graphics2D g2 = bufferedImage.createGraphics();
            g2.drawImage(image, null, null);

            ImageIO.write(bufferedImage,"PNG", imageFile);
            return imageFile;

        }
        catch(IOException e){
            e.printStackTrace();
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我是一个初学者,这是我第一次使用游戏,也是第一次使用数据库。任何建议,以使这一工作,将不胜感激。

另外,在我的方法getConvertedPicture()中,我必须指定格式类型,是否有解决方法,以便用户可以上传他们想要的任何类型的图片。

Dav*_*vid 6

要将字节转换为图像而不知道文件类型,我通常会这样做:

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
BufferedImage image = ImageIO.read(bais);
Run Code Online (Sandbox Code Playgroud)

这将返回一个BufferedImage,您可以将其保存为任何图片格式,例如jpg。

要将图像写回到字节数组:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
byte [] bytes = baos.toByteArray();
Run Code Online (Sandbox Code Playgroud)