java 图片比例_java图片生成等比例图片

1 packagecom.thinkdee.util;2

3

4 importjava.awt.image.BufferedImage;5 importjava.io.File;6

7 importjavax.imageio.ImageIO;8

9 public classScaleImage {10

11 publicScaleImage() {12 support =3D;13 PI = 3.1415926535897798D;14 }15

16

17 /**

18 *19 * Summary: 20 * saveImageAsJpg(生成等比例图片)21 *@paramfromFileStr22 *@paramsaveToFileStr23 *@paramformatWideth24 *@paramformatHeight25 *@throwsException26 */

27 public voidsaveImageAsJpg(String fromFileStr, String saveToFileStr,28 int formatWideth, int formatHeight) throwsException {29 File saveFile = newFile(saveToFileStr);30 File fromFile = newFile(fromFileStr);31 BufferedImage srcImage =ImageIO.read(fromFile);32 int imageWideth = srcImage.getWidth(null);33 int imageHeight = srcImage.getHeight(null);34 int changeToWideth = 0;35 int changeToHeight = 0;36 if (imageWideth > 0 && imageHeight > 0)37 if (imageWideth / imageHeight >= formatWideth /formatHeight) {38 if (imageWideth >formatWideth) {39 changeToWideth =formatWideth;40 changeToHeight = (imageHeight * formatWideth) /imageWideth;41 } else{42 changeToWideth =imageWideth;43 changeToHeight =imageHeight;44 }45 } else if (imageHeight >formatHeight) {46 changeToHeight =formatHeight;47 changeToWideth = (imageWideth * formatHeight) /imageHeight;48 } else{49 changeToWideth =imageWideth;50 changeToHeight =imageHeight;51 }52 srcImage =imageZoomOut(srcImage, changeToWideth, changeToHeight);53 ImageIO.write(srcImage, "JPEG", saveFile);54 }55

56 public BufferedImage imageZoomOut(BufferedImage srcBufferImage, int w, inth) {57 width =srcBufferImage.getWidth();58 height =srcBufferImage.getHeight();59 scaleWidth =w;60 if (DetermineResultSize(w, h) == 1) {61 returnsrcBufferImage;62 } else{63 CalContrib();64 BufferedImage pbOut =HorizontalFiltering(srcBufferImage, w);65 BufferedImage pbFinalOut =VerticalFiltering(pbOut, h);66 returnpbFinalOut;67 }68 }69

70 private int DetermineResultSize(int w, inth) {71 double scaleH = (double) w / (double) width;72 double scaleV = (double) h / (double) height;73 return scaleH < 1.0D || scaleV < 1.0D ? 0 : 1;74 }75

76 private double Lanczos(int i, int inWidth, int outWidth, doubleSupport) {77 double x = ((double) i * (double) outWidth) / (double) inWidth;78 return ((Math.sin(x * PI) / (x * PI)) * Math.sin((x * PI) /Support))79 / ((x * PI) /Support);80 }81

82 private voidCalContrib() {83 nHalfDots = (int) (((double) width * support) / (double) scaleWidth);84 nDots = nHalfDots * 2 + 1;85 try{86 contrib = new double[nDots];87 normContrib = new double[nDots];88 tmpContrib = new double[nDots];89 } catch(Exception e) {90 System.out.println("init contrib,normContrib,tmpContrib" +e);91 }92 int center =nHalfDots;93 contrib[center] = 1.0D;94 double weight = 0.0D;95 int i = 0;96 for (i = 1; i <= center; i++) {97 contrib[center + i] =Lanczos(i, width, scaleWidth, support);98 weight += contrib[center +i];99 }100

101 for (i = center - 1; i >= 0; i--)102 contrib[i] = contrib[center * 2 -i];103

104 weight = weight * 2D + 1.0D;105 for (i = 0; i <= center; i++)106 normContrib[i] = contrib[i] /weight;107

108 for (i = center + 1; i < nDots; i++)109 normContrib[i] = normContrib[center * 2 -i];110

111 }112

113 private void CalTempContrib(int start, intstop) {114 double weight = 0.0D;115 int i = 0;116 for (i = start; i <= stop; i++)117 weight +=contrib[i];118

119 for (i = start; i <= stop; i++)120 tmpContrib[i] = contrib[i] /weight;121

122 }123

124 private int GetRedValue(intrgbValue) {125 int temp = rgbValue & 0xff0000;126 return temp >> 16;127 }128

129 private int GetGreenValue(intrgbValue) {130 int temp = rgbValue & 0xff00;131 return temp >> 8;132 }133

134 private int GetBlueValue(intrgbValue) {135 return rgbValue & 0xff;136 }137

138 private int ComRGB(int redValue, int greenValue, intblueValue) {139 return (redValue << 16) + (greenValue << 8) +blueValue;140 }141

142 private int HorizontalFilter(BufferedImage bufImg, int startX, intstopX,143 int start, int stop, int y, doublepContrib[]) {144 double valueRed = 0.0D;145 double valueGreen = 0.0D;146 double valueBlue = 0.0D;147 int valueRGB = 0;148 int i =startX;149 for (int j = start; i <= stopX; j++) {150 valueRGB =bufImg.getRGB(i, y);151 valueRed += (double) GetRedValue(valueRGB) *pContrib[j];152 valueGreen += (double) GetGreenValue(valueRGB) *pContrib[j];153 valueBlue += (double) GetBlueValue(valueRGB) *pContrib[j];154 i++;155 }156

157 valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),158 Clip((int) valueBlue));159 returnvalueRGB;160 }161

162 private BufferedImage HorizontalFiltering(BufferedImage bufImage, intiOutW) {163 int dwInW =bufImage.getWidth();164 int dwInH =bufImage.getHeight();165 int value = 0;166 BufferedImage pbOut = new BufferedImage(iOutW, dwInH, 1);167 for (int x = 0; x < iOutW; x++) {168 int X = (int) (((double) x * (double) dwInW) / (double) iOutW + 0.5D);169 int y = 0;170 int startX = X -nHalfDots;171 intstart;172 if (startX < 0) {173 startX = 0;174 start = nHalfDots -X;175 } else{176 start = 0;177 }178 int stopX = X +nHalfDots;179 intstop;180 if (stopX > dwInW - 1) {181 stopX = dwInW - 1;182 stop = nHalfDots + (dwInW - 1 -X);183 } else{184 stop = nHalfDots * 2;185 }186 if (start > 0 || stop < nDots - 1) {187 CalTempContrib(start, stop);188 for (y = 0; y < dwInH; y++) {189 value =HorizontalFilter(bufImage, startX, stopX, start,190 stop, y, tmpContrib);191 pbOut.setRGB(x, y, value);192 }193

194 } else{195 for (y = 0; y < dwInH; y++) {196 value =HorizontalFilter(bufImage, startX, stopX, start,197 stop, y, normContrib);198 pbOut.setRGB(x, y, value);199 }200

201 }202 }203

204 returnpbOut;205 }206

207 private int VerticalFilter(BufferedImage pbInImage, int startY, intstopY,208 int start, int stop, int x, doublepContrib[]) {209 double valueRed = 0.0D;210 double valueGreen = 0.0D;211 double valueBlue = 0.0D;212 int valueRGB = 0;213 int i =startY;214 for (int j = start; i <= stopY; j++) {215 valueRGB =pbInImage.getRGB(x, i);216 valueRed += (double) GetRedValue(valueRGB) *pContrib[j];217 valueGreen += (double) GetGreenValue(valueRGB) *pContrib[j];218 valueBlue += (double) GetBlueValue(valueRGB) *pContrib[j];219 i++;220 }221

222 valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),223 Clip((int) valueBlue));224 returnvalueRGB;225 }226

227 private BufferedImage VerticalFiltering(BufferedImage pbImage, intiOutH) {228 int iW =pbImage.getWidth();229 int iH =pbImage.getHeight();230 int value = 0;231 BufferedImage pbOut = new BufferedImage(iW, iOutH, 1);232 for (int y = 0; y < iOutH; y++) {233 int Y = (int) (((double) y * (double) iH) / (double) iOutH + 0.5D);234 int startY = Y -nHalfDots;235 intstart;236 if (startY < 0) {237 startY = 0;238 start = nHalfDots -Y;239 } else{240 start = 0;241 }242 int stopY = Y +nHalfDots;243 intstop;244 if (stopY > iH - 1) {245 stopY = iH - 1;246 stop = nHalfDots + (iH - 1 -Y);247 } else{248 stop = nHalfDots * 2;249 }250 if (start > 0 || stop < nDots - 1) {251 CalTempContrib(start, stop);252 for (int x = 0; x < iW; x++) {253 value =VerticalFilter(pbImage, startY, stopY, start, stop,254 x, tmpContrib);255 pbOut.setRGB(x, y, value);256 }257

258 } else{259 for (int x = 0; x < iW; x++) {260 value =VerticalFilter(pbImage, startY, stopY, start, stop,261 x, normContrib);262 pbOut.setRGB(x, y, value);263 }264

265 }266 }267

268 returnpbOut;269 }270

271 int Clip(intx) {272 if (x < 0)273 return 0;274 if (x > 255)275 return 255;276 else

277 returnx;278 }279

280 private intwidth;281 private intheight;282 private intscaleWidth;283 doublesupport;284 doublePI;285 doublecontrib[];286 doublenormContrib[];287 doubletmpContrib[];288 intstartContrib;289 intstopContrib;290 intnDots;291 intnHalfDots;292 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值