锁定老帖子 主题:上传图片并生成缩略图
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-11-27
首先做之前,google了一下,发现很多生产缩略图的方法: BufferedImage img = ImageIO.read(file); int h = img.getHeight(); int w = img.getWidth(); if(h>=96 && w >=96){ int nw = 96; int nh = (nw * h) / w; if(nh>96) { nh = 96; nw = (nh * w) / h; } ByteArrayOutputStream out = new ByteArrayOutputStream(); BufferedImage dest = new BufferedImage(nw, nh, BufferedImage.TYPE_INT_RGB); dest.getGraphics().drawImage(img,0,0,nw, nh,null); ImageIO.write(dest, "jpeg", out); imageThumbnail = out.toByteArray(); } else{ imageThumbnail = imageData; } 但是使用后发现,对于底色是透明的图片,生成的缩略图是别的颜色的,于是找原因,发现jpeg是最大的祸首; 现在修改代码: BufferedImage img = ImageIO.read(file); int h = img.getHeight(); int w = img.getWidth(); if(h>=96 && w >=96){ int nw = 96; int nh = (nw * h) / w; if(nh>96) { nh = 96; nw = (nh * w) / h; } ByteArrayOutputStream out = new ByteArrayOutputStream(); BufferedImage dest = new BufferedImage(nw, nh,BufferedImage.TYPE_4BYTE_ABGR); dest.getGraphics().drawImage(img,0,0,nw, nh,null); GifEncoder.encode(dest, out); //ImageIO.write(dest, "gif", out); imageThumbnail = out.toByteArray(); } else{ imageThumbnail = imageData; } 其中使用了GifEncoder这也类,对应的jar包就是gif89.jar,这是个开源的包,做了修改,去掉了恶心的公司logo,现在生成的缩略图没有问题了,连gif的动画也能缩略,强啊 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-12-16
这个很实用,多谢
另外我回这样的帖子应该没问题吧?? 发了个贴问问题,结果不知道怎么了减了10分,提心吊胆,我好像没说错话呀:) |
|
返回顶楼 | |
发表时间:2007-12-17
谢谢楼主了
|
|
返回顶楼 | |
发表时间:2007-12-17
麻烦测试一下 1000×50,50×1000的图片
|
|
返回顶楼 | |
发表时间:2007-12-17
gif89.jar里好像没有GifEncoder这个类,有Gif89Encoder,但是如果换成Gif89Encoder这个类,好像这个类里没有encode这个方法,还是楼主忘传了什么东西?
|
|
返回顶楼 | |
发表时间:2007-12-17
ttitfly 写道 gif89.jar里好像没有GifEncoder这个类,有Gif89Encoder,但是如果换成Gif89Encoder这个类,好像这个类里没有encode这个方法,还是楼主忘传了什么东西?
不好意思,jar包上传错了 |
|
返回顶楼 | |
发表时间:2007-12-17
xio 写道 麻烦测试一下 1000×50,50×1000的图片
具体怎么缩小图片,可以自己修改对应的缩放比例 |
|
返回顶楼 | |
发表时间:2007-12-17
今天公司老大不在,难得一闲,另外把上传部分也补全了吧!
这里就介绍两个上传框架: 1.Common-FileUpload,可以在apache的网站上下载 2.COS框架,oreilly组织下的一个小项目,它比Common-FileUpload更加方便 这里就是用Common-FileUpload来实现吧,因为公司里是直接在Common-FileUpload上又包装了一层,这里介绍的是在servlet中的用法,这样跑起来看看也方便 import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { FileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(4096); factory.setRepository(tempPathFile); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(2*1024*1024); List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { File file = new File(fi.getName()); //这里可以插入得到缩略图的方法,当然最好还是写成单独一个//方法比较好; fi.write(file); } } System.out.print("upload succeed"); } catch (Exception e) { e.printStackTrace(); } } |
|
返回顶楼 | |
发表时间:2007-12-17
楼主有没有测试例子,上传一个,谢谢
|
|
返回顶楼 | |
发表时间:2007-12-22
如果是在上传前生成缩略图 ,就不用那么麻烦,直接用js就行了。
|
|
返回顶楼 | |