[英]Java converting byte[] to image
我知道這似乎是一個常見的問題,但我在互聯網上四處瀏覽,並嘗試了許多不同的教程和方法來執行此操作。 我想我很近,但不確定。 我也正在使用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)
...
這是我的代碼,在其中我從表單中獲取圖片並將圖像轉換為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());
}
這是我嘗試將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;
}
}
我是一個初學者,這是我第一次使用游戲,也是第一次使用數據庫。 任何建議,以使這一工作,將不勝感激。
另外,在我的方法getConvertedPicture()中,我必須指定格式類型,無論如何都可以解決這個問題,以便用戶可以上傳他們想要的任何類型的圖片。
要將字節轉換為圖像而不知道文件類型,我通常會這樣做:
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();
要將字節數組(即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();
}
我認為這可以用於png
, gif
, bmp
和jpg
圖像。 如本例所示,字節數組不必進行硬編碼。
另外,可以使用new ImageIcon("image.png").getImage()
從文件中加載可顯示的圖像,其中image.png
是文件名。
嘗試使用
byte[] byteArray=null; //need to initialize it
ImageIcon imageIcon = new ImageIcon(byteArray);
imageIcon.getImage();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.