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

如题所述

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

也就是图片压缩,可以不修改任何大小的压缩(速度快),也可等比例修改大小压缩(较慢)

下面这是一段等比例缩小图片的方法。

publicStringcompressPic(StringinputDir,StringoutputDir,

StringinputFileName,StringoutputFileName,intwidth,

intheight,booleangp,Stringhzm){

try{

if(!()){

return"";

}

Imageimg=(image);

//判断图片格式是否正确

if((null)==-1){

return"no";

}else{

intnewWidth;intnewHeight;

//判断是否是等比缩放

if(gp==true){

//为等比缩放计算输出的图片宽度及高度

doublerate1=((double)(null))/(double)width;

doublerate2=((double)(null))/(double)height;

//根据缩放比率大的进行缩放控制

doublerate=rate1>rate2?rate1:rate2;

newWidth=(int)(((double)(null))/rate);

newHeight=(int)(((double)(null))/rate);

}else{

newWidth=(null);//输出的图片宽度

newHeight=(null);//输出的图片高度

}

BufferedImagetag=newBufferedImage((int)newWidth,(int)newHeight,_INT_RGB);

/*

*_SMOOTH的缩略算法生成缩略图片的平滑度的

*优先级比速度高生成的图片质量比较好但速度慢

*/

Imageim=(newWidth,newHeight,_SMOOTH);

().drawImage(im,0,0,null);

FileOutputStreamout=newFileOutputStream(outputDir+outputFileName);

//JPEGImageEncoder可适用于其他图片类型的转换

JPEGImageEncoderencoder=(out);

(tag);

();

}

}catch(IOExceptionex){

();

}

return"ok";

}

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

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

建立一个AffineTransform

AffineTransform(doublem00,doublem10,doublem01,doublem11,doublem02,doublem12)

转换矩阵,缩放比较简单(矩阵可以干很多事情,想做图像处理软件可以研究下)

[x'][m00m01m02][x][m00x+m01y+m02]

[y']=[m10m11m12][y]=[m10x+m11y+m12]

[1][001][1][1]

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

再建一个AffineTransformOp,把上面的转换传进去

AffineTransformOp(AffineTransformxform,intinterpolationType)

最后调用AffineTransformOp的BufferedImagefilter(BufferedImagesrc,BufferedImagedst),src传原图片,返回值就是想要的Image,注意是返回值,不是dst,不明白可以看下JavaAPI

java图片压缩比为1

java压缩图片,按照比例进行压缩

publicstaticvoidmain(String[]args){

try{

//图片所在路径

BufferedImagetemplateImage=(newFile("C:\\Users\\晏丁丁\\Pictures\\图片1.png"));

//原始图片的长度和宽度

intheight=();

intwidth=();

//通过比例压缩

floatscale=0.5f;

//通过固定长度压缩

/*intdoWithHeight=100;

intdowithWidth=300;*/

//压缩之后的长度和宽度

intdoWithHeight=(int)(scale*height);

intdowithWidth=(int)(scale*width);

BufferedImagefinalImage=newBufferedImage(dowithWidth,doWithHeight,_INT_RGB);

().drawImage((dowithWidth,doWithHeight,_SMOOTH),0,0,null);

//图片输出路径,以及图片名

FileOutputStreamfileOutputStream=newFileOutputStream("D:/image/");

JPEGImageEncoderencoder=(fileOutputStream);

(finalImage);

();

}catch(IOExceptione){

e.printStackTrace();

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

文章知

温馨提示:答案为网友推荐,仅供参考
相似回答