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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何实现把一个大图片压缩到指定大小的图片且长宽比不变相关的知识,希望对你有一定的参考价值。

比如一张图片是20mb 我要求压缩到2mb 但长和宽的比值不变 怎么压缩
不能手动指定分辨率 只求大小变小即可

也就是图片压缩,可以不修改任何大小的压缩(速度快),也可等比例修改大小压缩(较慢)
下面这是一段等比例缩小图片的方法。

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";
参考技术A

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

参考技术B 新建一个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
参考技术C 使用Thumbnailator类库Thumbnails.of(file).scale(1f).outputQuality(0.25f).toFile(new File(newfilename); 参考技术D 您好,您这样:
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/

把文档中的扫描照片,往小压缩,小于500KB,怎么弄啊?

格式上的压缩:如果图片是BMP等比较大体积的图片格式,可以通过PS等软件,把图片格式更改为JPG或者GIF等体积较小的格式来实现。

大小上的压缩:可以把图片的大小进行更改,比如把1600X1200的图片改成800X600,图片体积自然也就小到1/4。

1:将压缩软件安装到自己的电脑中,打开这款压缩软件,找到图片压缩,进入到压缩的页面。

2:进入到压缩页面后,会看到压缩的选项以及压缩的输出格式,将压缩选项以及输出格式调整到自己需要的选项即可。

3:在往下可以看到保存至,将压缩完成的保存路径设置到指定的文件夹中,可以点击后面的文件夹图标进行设置,也可以保存到原文件夹。

4:点击选择文件,选择需要进行压缩的图片文件,也可以直接将图片文件拖进压缩的页面。

参考技术A

可以先把照片保存下来,之后用在线软件修改照片大小,或者是直接压缩文件大小就可以了


改图宝,用这个在线软件,上传照片后,压缩文件大小,输入500KB,保存之后就是500KB的照片了

扩展资料:

Word2000如何压缩图片:

(1)打开或者新建一个word文档,可以在桌面空白处单击鼠标右键选择新建,也可以点击开始新建一个word文档。

(2)你要选中你要压缩的图片,如果有多张图片需要压缩,可以安装ctrl键进行选择。

(3)点击图片打开图片工具,在调整区域中点击压缩图片。

(4)打开压缩图片对话框,选择压缩选项以及输出目标,然后点击确定

参考技术B 1、先把图片【另存为……】导出来,保存在硬盘上2、用系统自带的【画图】工具,打开,另存为【JPG】格式3、在文件用另存的JPG图片,换掉文件中的图片,就可以了一般情况下,用【画图】工具,另存的【JPG】可以把1MB左右的图片,压到100—200KB左右 参考技术C

你好,压缩图片大小的话,可以使用在线图片压缩网站,可以直接在线压缩啊,非常方便。

还可以自行选择压缩图片的品质。

参考技术D 我知道,我也经常扫描的。你扫描的时候应该也是用windows自带的画图吧。你另存为的时候选择jpeg格式储存,也就是jpg后缀名的。这样就会比较小,而且效果也很不错

以上是关于java如何实现把一个大图片压缩到指定大小的图片且长宽比不变的主要内容,如果未能解决你的问题,请参考以下文章

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

求助java压缩图片存储大小的方法

您好!请问用java怎么将截取png的图片中间一部分,以及如何压缩一个png图片?

PNG文件大小如何压缩?

png图片怎么通过代码实现压缩到指定的文件大小,比如5M压缩到200KB,比如用pngquant或imageMagick

如何把2M以上的图片缩小到100k以内,谢谢