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 }