java如何实现把一个大图片压缩到指定大小的图片且长宽比不变 100
不能手动指定分辨率 只求大小变小即可 展开
下面这是一段等比例缩小图片的方法。
public String compressPic(String inputDir, String outputDir,
String inputFileName, String outputFileName, int width,
int height, boolean gp,String hzm) {
try {
if (!image.exists()) {
return "";
}
Image img = ImageIO.read(image);
// 判断图片格式是否正确
if (img.getWidth(null) == -1) {
return "no";
} else {
int newWidth; int newHeight;
// 判断是否是等比缩放
if (gp == true) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) img.getWidth(null)) / (double) width ;
double rate2 = ((double) img.getHeight(null)) / (double) height ;
// 根据缩放比率大的进行缩放控制
double rate = rate1 > rate2 ? rate1 : rate2;
newWidth = (int) (((double) img.getWidth(null)) / rate);
newHeight = (int) (((double) img.getHeight(null)) / rate);
} else {
newWidth = img.getWidth(null); // 输出的图片宽度
newHeight = img.getHeight(null); // 输出的图片高度
}
BufferedImage tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);
/*
* Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的
* 优先级比速度高 生成的图片质量比较好 但速度慢
*/
Image im = img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
tag.getGraphics().drawImage(im, 0, 0, null);
FileOutputStream out = new FileOutputStream(outputDir + outputFileName);
//JPEGImageEncoder可适用于其他图片类型的转换
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
return "ok";
}
java要实现把一个大图片压缩到指定大小的图片且长宽比不变可以尝试以下操作:
建立一个AffineTransform
AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
转换矩阵,缩放比较简单(矩阵可以干很多事情,想做图像处理软件可以研究下)
[ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ]
[ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ]
[ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ]10倍比较难算(根号10啊,当然你想算也行),9倍好点(9的开方是3),m00为1/3,m01为0,m02为0,m10为0,m11为1/3,m12为0。
再建一个AffineTransformOp,把上面的转换传进去
AffineTransformOp(AffineTransform xform, int interpolationType)最后调用AffineTransformOp的BufferedImage filter(BufferedImage src, BufferedImage dst) ,src传原图片,返回值就是想要的Image,注意是返回值,不是dst,不明白可以看下Java API
AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
要自己算转换矩阵,缩放比较简单(矩阵可以干很多事情,想做图像处理软件可以研究下)
[ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ]
[ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ]
[ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ]
10倍比较难算(根号10啊,当然你想算也行),9倍好点(9的开方是3),m00为1/3,m01为0,m02为0,m10为0,m11为1/3,m12为0。
再新建一个AffineTransformOp,把上面的转换传进去
AffineTransformOp(AffineTransform xform, int interpolationType)
调用AffineTransformOp的BufferedImage filter(BufferedImage src, BufferedImage dst) ,src传原图片,返回值就是想要的Image,注意是返回值,不是dst,不明白可以看下Java API
java . awt . graphics2d进口;
进口java.awt.Image;
进口java.awt.image.BufferedImage;
进口java.io.File;
进口java.io.FileInputStream;
进口java.io.FileNotFoundException;
进口java.io.IOException;
进口javax.imageio.ImageIO;
/ * *
* * @author WQ * @date 2011-01-14 * 1.0 @versions图片压缩工具类提供的方法中可以设定生成的
*缩略图片的大小尺寸等
* /
公开课ImageUtil {
/ * * *图片文件读取* * @param srcImgPath * @return * /
私有静态BufferedImage InputImage(字符串srcImgPath){
BufferedImage srcImage =零;
尝试{
FileInputStream =新FileInputStream(srcImgPath);
srcImage = javax.imageio.ImageIO.read(的);
}捕捉(IOException e){
system . out。 println(“读取图片文件出错!”+ e.getMessage());
e.printStackTrace();
}
返回srcImage;
}
公共静态void main(String参数[]){
尝试{
地图<整数、字符串>地图= readfile(E:/元,null);
(int i = 0;我< map.size();我+ +){
System.out.println(map.get我(我)+ " = = " +);
System.out.println();
字符串在媒介= map.get(我);
compressImage(map.get(我),“E:/ ww / _“+ +”。 png ",100年,75年);
}
}捕捉(异常交货){
}
System.out.println(“ok”);
}
/ * *
* *将图片按照指定的图片尺寸压缩* * @param srcImgPath:源图片路径* @param outImgPath *
*:输出的压缩图片的路径* @param new_w *:压缩后的图片宽* @param new_h *:压缩后的图片高
* /
srcImgPath公共静态孔隙compressImage(字符串,字符串outImgPath,
int new_w int new_h){
BufferedImage src = InputImage(srcImgPath);
disposeImage(src,outImgPath new_w new_h);
}
/ * *
* *指定长或者宽的最大值来压缩图片* * @param srcImgPath *:源图片路径* @param outImgPath *
*:输出的压缩图片的路径* @param最大长度*:长或者宽的最大值
* /
srcImgPath公共静态孔隙compressImage(字符串,字符串outImgPath,
int最大长度){
/ /得到图片
BufferedImage src = InputImage(srcImgPath);
如果(空! = src){
int old_w = src.getWidth();
/ /得到源图宽
int old_h = src.getHeight();
/ /得到源图长
int new_w = 0;
/ /新图的宽
int new_h = 0;
/ /新图的长
/ /根据图片尺寸压缩比得到新图的尺寸
如果(old_w > old_h){
/ /图片要缩放的比例
new_w =最大长度;
new_h =(int)数学。 轮(old_h *((浮动)最大长度/ old_w));
其他} {
new_w =(int)数学。 轮(old_w *((浮动)最大长度/ old_h));
new_h =最大长度;
}
disposeImage(src,outImgPath new_w new_h);
}
}
/ * * *处理图片* * @param src * @param outImgPath * @param new_w * @param new_h * /
私人同步静态孔隙disposeImage(BufferedImage src,
字符串outImgPath、int new_w int new_h){
/ /得到图片
int old_w = src.getWidth();
/ /得到源图宽
int old_h = src.getHeight();
/ /得到源图长
BufferedImage newImg =零;
/ /判断输入图片的类型
开关(src.getType()){
例13:
/ / png,gifnewImg =新BufferedImage(new_w new_h,
/ / BufferedImage.TYPE_4BYTE_ABGR);
打破;
默认值:
newImg =新BufferedImage(new_w,new_h BufferedImage.TYPE_INT_RGB);
打破;
}
Graphics2D g = newImg.createGraphics();
/ /从原图上取颜色绘制新图
g。 drawImage(src,0,0,old_w,old_h,null);
g.dispose();
/ /根据图片尺寸压缩比得到新图的尺寸
newImg.getGraphics().drawImage(
src。 getScaledInstance(new_w new_h Image.SCALE_SMOOTH),0,0,
空);
/ /调用方法输出图片文件
OutImage(outImgPath newImg);
}
/ * *
* *将图片文件输出到指定的路径,并可设定压缩质量* * @param outImgPath * @param newImg * @param
* /
* /
私有静态孔隙OutImage(字符串outImgPath BufferedImage newImg){
/ /判断输出的文件夹路径是否存在,不存在则创建
文件文件=新文件(outImgPath);
如果(! file.getParentFile().exists()){
.mkdirs file.getParentFile()();
} / /输出到文件流
尝试{
ImageIO。 写(newImg outImgPath.substring(outImgPath
.lastIndexOf(“。”)+ 1),新文件(outImgPath));
}捕捉(FileNotFoundException e){
e.printStackTrace();
}捕捉(IOException e){
e.printStackTrace();
}
}
公共静态地图<整数、字符串> readfile(字符串filepath,
<整数、字符串>映射路径映射)抛出异常{
如果(路径映射= = null){
路径映射=新HashMap <整数、字符串>();
}
文件文件=新文件(filepath);
/ /文件
如果(! file.isDirectory()){
file.getPath pathMap.put(pathMap.size()());
} else if(file.isDirectory()){ / /如果是目录,遍历所有子目录取出所有文件名
String[]文件列表= file.list();
(int i = 0;我<文件列表。 长度;我+ +){
文件readfile =新文件(filepath + " +文件列表[我]);
如果(! readfile.isDirectory()){
readfile.getPath pathMap.put(pathMap.size()());
如果其他}(readfile.isDirectory()){ / /子目录的目录
readfile(filepath + " +文件列表(我),路径映射);
}
}
}
返回路径映射;
}
}
转http://lijinzhe.blog.163.com/blog/static/62147668201222024822711/