|
精华帖 (0) :: 良好帖 (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的动画也能缩略,强啊 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间: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就行了。
|
|
| 返回顶楼 | |





