JAVA圖像縮放處理_第1頁
JAVA圖像縮放處理_第2頁
JAVA圖像縮放處理_第3頁
JAVA圖像縮放處理_第4頁
JAVA圖像縮放處理_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、JAVA圖像縮放處理 今天在網(wǎng)上看到了一篇關(guān)于JAVA圖像處理的文章,博主貼出了一個處理類:特點是高品質(zhì)縮小,具體代碼如下: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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論