JAVA图像缩放处理_第1页
JAVA图像缩放处理_第2页
JAVA图像缩放处理_第3页
JAVA图像缩放处理_第4页
JAVA图像缩放处理_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JAVA图像缩放处理 今天在网上看到了一篇关于JAVA图像处理的文章,博主贴出了一个处理类:特点是高品质缩小,具体代码如下:import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.ImageIO;public class ImageScale     privat

2、e int width;    private int height;    private int scaleWidth;    double support = (double) 3.0;    double contrib;    double normContrib;&#

3、160;   double tmpContrib;    int startContrib, stopContrib;    int nDots;    int nHalfDots;    public BufferedImage imageZoomOut(BufferedImage srcBufferImage, i

4、nt w, int h, boolean lockScale)         width = srcBufferImage.getWidth();        height = srcBufferImage.getHeight();        scal

5、eWidth = w;        if (lockScale)             h = w * height / width;             

6、60;  if (DetermineResultSize(w, h) = 1)             return srcBufferImage;                CalContrib();   

7、;     BufferedImage pbOut = HorizontalFiltering(srcBufferImage, w);        BufferedImage pbFinalOut = VerticalFiltering(pbOut, h);        return pbFin

8、alOut;        /* */*     * 决定图像尺寸     */    private int DetermineResultSize(int w, int h)         double 

9、scaleH, scaleV;        scaleH = (double) w / (double) width;        scaleV = (double) h / (double) height;        /

10、 需要判断一下scaleH,scaleV,不做放大操作        if (scaleH >= 1.0 && scaleV >= 1.0)             return 1;       &#

11、160;        return 0;     / end of DetermineResultSize()    private double Lanczos(int i, int inWidth, int outWidth, double Support)   

12、      double x;        x = (double) i * (double) outWidth / (double) inWidth;        return Math.sin(x * Math.PI) / 

13、;(x * Math.PI) * Math.sin(x * Math.PI / Support) / (x * Math.PI / Support);     / end of Lanczos()    /    / Assumption: same horizonta

14、l and vertical scaling factor    /    private void CalContrib()         nHalfDots = (int) (double) width * support / (double) scaleWidth);&#

15、160;       nDots = nHalfDots * 2 + 1;        try             contrib = new doublenDots;    

16、0;       normContrib = new doublenDots;            tmpContrib = new doublenDots;         catch (Exception e)  

17、           System.out.println("init contrib,normContrib,tmpContrib" + e);                int center = nHalfDots;  &

18、#160;     contribcenter = 1.0;        double weight = 0.0;        int i = 0;        for (i = 1; 

19、;i <= center; i+)             contribcenter + i = Lanczos(i, width, scaleWidth, support);            weight += c

20、ontribcenter + i;                for (i = center - 1; i >= 0; i-)             contribi =

21、0;contribcenter * 2 - i;                weight = weight * 2 + 1.0;        for (i = 0; i <= center

22、; i+)             normContribi = contribi / weight;                for (i = center + 1; i <&

23、#160;nDots; i+)             normContribi = normContribcenter * 2 - i;             / end of CalContrib()   

24、; / 处理边缘    private void CalTempContrib(int start, int stop)         double weight = 0;        int i = 0;    &

25、#160;   for (i = start; i <= stop; i+)             weight += contribi;                for

26、60;(i = start; i <= stop; i+)             tmpContribi = contribi / weight;             / end of CalTem

27、pContrib()    private int GetRedValue(int rgbValue)         int temp = rgbValue & 0x00ff0000;        return temp >> 16;  

28、;      private int GetGreenValue(int rgbValue)         int temp = rgbValue & 0x0000ff00;        return temp >> 8; &

29、#160;      private int GetBlueValue(int rgbValue)         return rgbValue & 0x000000ff;        private int ComRGB(int redValue, int

30、 greenValue, int blueValue)         return (redValue << 16) + (greenValue << 8) + blueValue;        / 行水平滤波    private

31、 int HorizontalFilter(BufferedImage bufImg, int startX, int stopX, int start, int stop, int y,            double pContrib)        

32、 double valueRed = 0.0;        double valueGreen = 0.0;        double valueBlue = 0.0;        int valueRGB = 0;

33、0;       int i, j;        for (i = startX, j = start; i <= stopX; i+, j+)             valueR

34、GB = bufImg.getRGB(i, y);            valueRed += GetRedValue(valueRGB) * pContribj;            valueGreen += GetGreenValue(valueRGB)

35、60;* pContribj;            valueBlue += GetBlueValue(valueRGB) * pContribj;                valueRGB = ComRGB(Clip(int) v

36、alueRed), Clip(int) valueGreen), Clip(int) valueBlue);        return valueRGB;     / end of HorizontalFilter()    / 图片水平滤波    private BufferedIma

37、ge HorizontalFiltering(BufferedImage bufImage, int iOutW)         int dwInW = bufImage.getWidth();        int dwInH = bufImage.getHeight();    &#

38、160;   int value = 0;        BufferedImage pbOut = new BufferedImage(iOutW, dwInH, BufferedImage.TYPE_INT_RGB);        for (int x = 0; 

39、x < iOutW; x+)             int startX;            int start;            int X 

40、;= (int) (double) x) * (double) dwInW) / (double) iOutW) + 0.5);            int y = 0;            startX 

41、= X - nHalfDots;            if (startX < 0)                 startX = 0;       

42、;         start = nHalfDots - X;             else                 start = 0

43、;                        int stop;            int stopX = X + nHalfDots;   

44、         if (stopX > (dwInW - 1)                 stopX = dwInW - 1;         &

45、#160;      stop = nHalfDots + (dwInW - 1 - X);             else                 

46、stop = nHalfDots * 2;                        if (start > 0 | stop < nDots - 1)     &

47、#160;           CalTempContrib(start, stop);                for (y = 0; y < dwInH; y+)      

48、               value = HorizontalFilter(bufImage, startX, stopX, start, stop, y, tmpContrib);               &#

49、160;    pbOut.setRGB(x, y, value);                             else         

50、0;       for (y = 0; y < dwInH; y+)                     value = HorizontalFilter(bufImage, startX, sto

51、pX, start, stop, y, normContrib);                    pbOut.setRGB(x, y, value);               &

52、#160;                            return pbOut;     / end of HorizontalFiltering()    private

53、60;int VerticalFilter(BufferedImage pbInImage, int startY, int stopY, int start, int stop, int x,            double pContrib)        &#

54、160;double valueRed = 0.0;        double valueGreen = 0.0;        double valueBlue = 0.0;        int valueRGB = 0; 

55、       int i, j;        for (i = startY, j = start; i <= stopY; i+, j+)             valueRGB

56、 = pbInImage.getRGB(x, i);            valueRed += GetRedValue(valueRGB) * pContribj;            valueGreen += GetGreenValue(valueRGB)&#

57、160;* pContribj;            valueBlue += GetBlueValue(valueRGB) * pContribj;                valueRGB = ComRGB(Clip(int) 

58、valueRed), Clip(int) valueGreen), Clip(int) valueBlue);        / System.out.println(valueRGB);        return valueRGB;     / end of VerticalFilter()&#

59、160;   private BufferedImage VerticalFiltering(BufferedImage pbImage, int iOutH)         int iW = pbImage.getWidth();        int iH = pbImage.get

60、Height();        int value = 0;        BufferedImage pbOut = new BufferedImage(iW, iOutH, BufferedImage.TYPE_INT_RGB);        for 

61、(int y = 0; y < iOutH; y+)             int startY;            int start;         &

62、#160;  int Y = (int) (double) y) * (double) iH) / (double) iOutH) + 0.5);            startY = Y - nHalfDots;      &

63、#160;     if (startY < 0)                 startY = 0;                start =&

64、#160;nHalfDots - Y;             else                 start = 0;           &

65、#160;            int stop;            int stopY = Y + nHalfDots;            if (stopY

66、 > (int) (iH - 1)                 stopY = iH - 1;                stop = nHalf

67、Dots + (iH - 1 - Y);             else                 stop = nHalfDots * 2;    &

68、#160;                   if (start > 0 | stop < nDots - 1)                &

69、#160;CalTempContrib(start, stop);                for (int x = 0; x < iW; x+)                

70、     value = VerticalFilter(pbImage, startY, stopY, start, stop, x, tmpContrib);                    pbOut.setRGB(x, y, value)

71、;                             else                 for (int x = 0; x < iW; x+)     

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论