3

これはよくある質問のように思えますが、インターネット全体を調べて、これを行うためのさまざまなチュートリアルと方法を試しました. 私は近いと思いますが、確かではありません。また、私は 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() では、フォーマットの種類を指定する必要があります。とにかくこれを回避して、ユーザーが必要な種類の画像をアップロードできるようにする必要があります。

4

3 に答える 3

7

ファイルタイプを知らずにバイトを画像に変換するには、通常は次のようにします。

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

これにより、jpg などの任意の画像形式に保存できる BufferedImage が返されます。

イメージをバイト配列に書き戻すには:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
byte [] bytes = baos.toByteArray();
于 2012-06-28T15:32:17.740 に答える
3

バイトの配列、つまりbyte[]画像に変換するには、を使用しますgetImage()。おそらくこれを行う最も簡単な方法はImageIcon、コンストラクターを使用してインスタンス化してからImageIcon(byte[])、を呼び出すこと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();
}

pngこれは、、、、および画像gifに使用できると思います。この例のように、バイト配列をハードコーディングする必要はありません。bmpjpg

さらに、new ImageIcon("image.png").getImage()ファイルから表示可能な画像をロードするために使用できます。ここimage.pngで、はファイル名です。

于 2012-10-01T01:21:21.887 に答える