论坛首页 Java企业应用论坛

上传图片并生成缩略图

浏览 35268 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-27  
最近公司说要在portal中添加一个上传图片并生成缩略图的方法,试了很久,终于搞定了;写下点心得吧,使大家少走弯路;
首先做之前,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的动画也能缩略,强啊
   发表时间:2007-12-16  
这个很实用,多谢
另外我回这样的帖子应该没问题吧??
发了个贴问问题,结果不知道怎么了减了10分,提心吊胆,我好像没说错话呀:)
0 请登录后投票
   发表时间:2007-12-17  
谢谢楼主了
0 请登录后投票
   发表时间:2007-12-17  
麻烦测试一下 1000×50,50×1000的图片
0 请登录后投票
   发表时间:2007-12-17  
gif89.jar里好像没有GifEncoder这个类,有Gif89Encoder,但是如果换成Gif89Encoder这个类,好像这个类里没有encode这个方法,还是楼主忘传了什么东西?
0 请登录后投票
   发表时间:2007-12-17  
ttitfly 写道
gif89.jar里好像没有GifEncoder这个类,有Gif89Encoder,但是如果换成Gif89Encoder这个类,好像这个类里没有encode这个方法,还是楼主忘传了什么东西?


不好意思,jar包上传错了
0 请登录后投票
   发表时间:2007-12-17  
xio 写道
麻烦测试一下 1000×50,50×1000的图片


具体怎么缩小图片,可以自己修改对应的缩放比例
0 请登录后投票
   发表时间: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();
		}
	}
0 请登录后投票
   发表时间:2007-12-17  
楼主有没有测试例子,上传一个,谢谢
0 请登录后投票
   发表时间:2007-12-22  
如果是在上传前生成缩略图 ,就不用那么麻烦,直接用js就行了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics