2014-01-26 76 views
1

我从inputStream创建图像,并使用了两种方法,但两种方法均失败。Java从inputStream创建图像

第1种方法:

FileOutputStream out=new FileOutputStream(file) 
byte[] byteBuffer = new byte[1024]; 
int length = 0; 
while ((stream != null) && ((length = stream.read(byteBuffer)) != -1)){ 
out.write(byteBuffer,0,length); 
} 
out.flush() 
out.close(); 
stream.close(); 

这种方法生成的图像,但在尝试打开它。它说“这不是有效的位图文件”。

而第二方法:

BufferedImage imBuff = ImageIO.read(stream); 
ImageIO.write(imBuff, 'png', file); 

而这一次产生例外。

java.lang.IllegalArgumentException:image == null! 在javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpe cifier.java:925) 在javax.imageio.ImageIO.getWriter(ImageIO.java:1591) 在javax.imageio.ImageIO.write(ImageIO.java:1520) 在com.k12report.frontend.ClientAuthoringController $$ EOU2Lt2o.getImages( ClientAuthoringController.groovy:55) 在grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PAG eFragmentCachingFilter.java:195) 在Grails的。 plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter .java:63) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor。 java:1145) 在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(的ThreadPoolExecutor 的.java:615) 在java.lang.Thread.run(Thread.java:722)

感谢

+2

什么是'stream'?它的内容是什么?您是否尝试将内容转储到磁盘并通过外部映像程序验证其有效性? – MadProgrammer

+0

stream = response.getEntityInputStream() – Biswas

+2

你确定你有一个有效的图像开始?在第二种方法中,'imBuff'为'null',这在ImageIO不识别文件格式时发生。你需要测试这种情况。你的第一种方法对我来说很好。你可能应该在循环之外检查'stream!= null'以获得可读性和性能。 – haraldK

回答

1

好,对于这不是一个有效的位图文件

使用文件分割符是比较推荐的方式,而不是使用“\”或“/”如果你正在使用的文件的路径,因为它们依赖于OS.They使你的代码更便携。

例子: -

File f = new File("C:"+File.separator+"Personal"+File.separator+"test.bmp");

+0

顺便说一句,有多少操作系统在开始时使用'C:'? –

+0

我正在使用grails,所以, 'def root = getServletContext()。getRealPath(“”); String path = root +'/ authoringImages /'+ images File file = new File(path);' – Biswas

+0

对我来说,使用**/**作为文件分隔符工作** always **(使用File-Object时) ...当使用窗户时...... – Ben