【问题标题】:Java converting byte[] to imageJava将字节[]转换为图像
【发布时间】:2012-06-28 15:10:04
【问题描述】:

我知道这似乎是一个常见问题,但我已经查看了整个互联网,并尝试了许多不同的教程和方法来做到这一点。我想我很接近,但不确定。我也在使用 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)
  ...

这是我的代码,我从表单中获取图片并将图像转换为字节 [] 并存储在 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());
}

这是我试图将字节 [] 转换回图像的地方,以便我可以在 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;
        }
    }

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

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

【问题讨论】:

  • 您的异常似乎表明 getImage() 的字节数不够。你检查了吗??
  • 不,我不知道怎么做。我检查以确保那里有数据,但不确定如何检查它是否实际存储正确。

标签: java sql playframework javax.imageio


【解决方案1】:

在不知道文件类型的情况下将字节转换为图像,我通常这样做:

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
BufferedImage image = ImageIO.read(bais);

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

要将图像写回字节数组:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
byte [] bytes = baos.toByteArray();

【讨论】:

  • 我的 BufferedImage 图像尺寸比 bais 大得多。例如,如果我在 bytearray 中有 9MB 的图片,则转换 BufferedImage 后要大得多。
【解决方案2】:

尝试使用

byte[] byteArray=null; //need to initialize it
ImageIcon imageIcon = new ImageIcon(byteArray);
imageIcon.getImage();

【讨论】:

    【解决方案3】:

    要将字节数组(即byte[])转换为图像,请使用getImage()。可能最简单的方法是使用ImageIcon(byte[]) 构造函数实例化ImageIcon,然后调用getImage()。这在下面的方法中得到了说明,尤其是最后一行:

    public Image createImage(){
       byte[] b = {-119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82,
          0, 0, 0, 15, 0, 0, 0, 15, 8, 6, 0, 0, 0, 59, -42, -107,
          74, 0, 0, 0, 64, 73, 68, 65, 84, 120, -38, 99, 96, -64, 14, -2,
          99, -63, 68, 1, 100, -59, -1, -79, -120, 17, -44, -8, 31, -121, 28, 81,
          26, -1, -29, 113, 13, 78, -51, 100, -125, -1, -108, 24, 64, 86, -24, -30,
          11, 101, -6, -37, 76, -106, -97, 25, 104, 17, 96, -76, 77, 97, 20, -89,
          109, -110, 114, 21, 0, -82, -127, 56, -56, 56, 76, -17, -42, 0, 0, 0,
          0, 73, 69, 78, 68, -82, 66, 96, -126};
       return new ImageIcon(b).getImage();
    }
    

    我认为这可以用于pnggifbmpjpg 图像。字节数组不必像本例那样进行硬编码。

    此外,new ImageIcon("image.png").getImage() 可用于从文件加载可显示的图像,其中image.png 是文件名。

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      相关资源
      最近更新 更多