java如何实现把一个大图片压缩到指定大小的图片且长宽比不变 100

比如一张图片是20mb我要求压缩到2mb但长和宽的比值不变怎么压缩不能手动指定分辨率只求大小变小即可... 比如一张图片是20mb 我要求压缩到2mb 但长和宽的比值不变 怎么压缩
不能手动指定分辨率 只求大小变小即可
展开
 我来答
智慧小岛
2015-03-19 · TA获得超过313个赞
知道答主
回答量:173
采纳率:0%
帮助的人:92.6万
展开全部
也就是图片压缩,可以不修改任何大小的压缩(速度快),也可等比例修改大小压缩(较慢)
下面这是一段等比例缩小图片的方法。

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";
}
L一Yolanda
2018-04-17 · TA获得超过3.1万个赞
知道大有可为答主
回答量:211
采纳率:100%
帮助的人:3.8万
展开全部

java要实现把一个大图片压缩到指定大小的图片且长宽比不变可以尝试以下操作:

  1. 建立一个AffineTransform

  2. AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)

  3. 转换矩阵,缩放比较简单(矩阵可以干很多事情,想做图像处理软件可以研究下)
    [ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ]
    [ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ]
    [ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ]

  4. 10倍比较难算(根号10啊,当然你想算也行),9倍好点(9的开方是3),m00为1/3,m01为0,m02为0,m10为0,m11为1/3,m12为0。

  5. 再建一个AffineTransformOp,把上面的转换传进去
    AffineTransformOp(AffineTransform xform, int interpolationType)

  6. 最后调用AffineTransformOp的BufferedImage filter(BufferedImage src, BufferedImage dst) ,src传原图片,返回值就是想要的Image,注意是返回值,不是dst,不明白可以看下Java API

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
LMLU23
2015-03-19 · TA获得超过901个赞
知道小有建树答主
回答量:373
采纳率:0%
帮助的人:365万
展开全部
新建一个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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
安居一隅zc
2017-09-20
知道答主
回答量:32
采纳率:0%
帮助的人:10.8万
展开全部
使用Thumbnailator类库Thumbnails.of(file).scale(1f).outputQuality(0.25f).toFile(new File(newfilename);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
山水阿锐
2015-03-19 · TA获得超过34.3万个赞
知道顶级答主
回答量:23.7万
采纳率:91%
帮助的人:3.2亿
展开全部
您好,您这样:
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/
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式