用java实现上传文件时,想要将大图片进行压缩处理之后,再保存到磁盘中,用各种办法都不行
方式一:单独在applet中运行,测试通过,但是将相关代码移植到我的程序代码中,就会在BufferedImagebis=ImageIO.read(fi);处出现内存溢出。...
方式 一:单独在applet中运行,测试通过,但是将相关代码移植到我的程序代码中,就会在 BufferedImage bis = ImageIO.read(fi); 处出现内存溢出。
package com.test.action.example.image;
import javax.imageio.ImageIO;
import javax.imageio.IIOException;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.io.File;
import java.awt.image.AffineTransformOp;
import java.awt.geom.AffineTransform;
public class Test {
public static void main (String argv[]) {
try {
File fi = new File("D:/tomcat/tongzoneupload/avatar/upload/profile/85/201303271244271364359467114.JPG"); //大图文件
File fo = new File("D:/tomcat/tongzoneupload/avatar/upload/profile/85/201303271244271364359467116.JPG"); //将要转换出的小图文件
AffineTransform transform = new AffineTransform(); BufferedImage bis = ImageIO.read(fi);
int w = bis.getWidth();
int h = bis.getHeight();
double scale = (double)w/h;
int nw = 500;
int nh = (nw * h) / w;
if(nh>500) {
nh = 500;
nw = (nh * w) / h;
}
double sx = (double)nw / w; double sy = (double)nh / h;
transform.setToScale(sx,sy);
AffineTransformOp ato = new AffineTransformOp(transform, null);
BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);
ato.filter(bis,bid);
ImageIO.write(bid, "jpeg", fo);
} catch(Exception e) {
e.printStackTrace();
}
}
}
于是,我采用第二种方式
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image srcImage = toolkit.getImage(imgUploadPath); // 构造Image对象
width = srcImage.getWidth(null); // 得到源图宽
height = srcImage.getHeight(null); // 得到源图长
int nw = 500;
int nh = (nw * height) / width;
if(nh>500) {
nh = 500;
nw = (nh * width) / height;
}
Image image = srcImage.getScaledInstance(nw, nh,Image.SCALE_DEFAULT);
BufferedImage tag = new BufferedImage(nw, nh,BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0,nw , nh,null); // 绘制缩小后的图
g.dispose();
// 输出图象到页面
ImageIO.write(tag, "png", new File(imgCropPath));// 输出到文件流
这两种试通过调整宽高都能把重新设置的图片存到磁盘中,可是图片是一片黑色失真图片。
请问有什么办法可以处理5M以内图片,又不会内存溢出,又可以存储到磁盘上,上面第一种方式单独运行applet是可以实现的。我不想用BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件
这种试 展开
package com.test.action.example.image;
import javax.imageio.ImageIO;
import javax.imageio.IIOException;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.io.File;
import java.awt.image.AffineTransformOp;
import java.awt.geom.AffineTransform;
public class Test {
public static void main (String argv[]) {
try {
File fi = new File("D:/tomcat/tongzoneupload/avatar/upload/profile/85/201303271244271364359467114.JPG"); //大图文件
File fo = new File("D:/tomcat/tongzoneupload/avatar/upload/profile/85/201303271244271364359467116.JPG"); //将要转换出的小图文件
AffineTransform transform = new AffineTransform(); BufferedImage bis = ImageIO.read(fi);
int w = bis.getWidth();
int h = bis.getHeight();
double scale = (double)w/h;
int nw = 500;
int nh = (nw * h) / w;
if(nh>500) {
nh = 500;
nw = (nh * w) / h;
}
double sx = (double)nw / w; double sy = (double)nh / h;
transform.setToScale(sx,sy);
AffineTransformOp ato = new AffineTransformOp(transform, null);
BufferedImage bid = new BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);
ato.filter(bis,bid);
ImageIO.write(bid, "jpeg", fo);
} catch(Exception e) {
e.printStackTrace();
}
}
}
于是,我采用第二种方式
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image srcImage = toolkit.getImage(imgUploadPath); // 构造Image对象
width = srcImage.getWidth(null); // 得到源图宽
height = srcImage.getHeight(null); // 得到源图长
int nw = 500;
int nh = (nw * height) / width;
if(nh>500) {
nh = 500;
nw = (nh * width) / height;
}
Image image = srcImage.getScaledInstance(nw, nh,Image.SCALE_DEFAULT);
BufferedImage tag = new BufferedImage(nw, nh,BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0,nw , nh,null); // 绘制缩小后的图
g.dispose();
// 输出图象到页面
ImageIO.write(tag, "png", new File(imgCropPath));// 输出到文件流
这两种试通过调整宽高都能把重新设置的图片存到磁盘中,可是图片是一片黑色失真图片。
请问有什么办法可以处理5M以内图片,又不会内存溢出,又可以存储到磁盘上,上面第一种方式单独运行applet是可以实现的。我不想用BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件
这种试 展开
1个回答
2013-04-16
展开全部
多大图片,增加JAVA的内存
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |