zoukankan      html  css  js  c++  java
  • 图片缩小 指定宽和高或按比例缩放

    package com.happigo.grab;
    
    
    /**
     * write by enter2000.com
     */
    import java.awt.image.BufferedImage;
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    import javax.imageio.ImageIO;
    
    public class ImageScale {
    
        private int width;
        private int height;
        private int scaleWidth;
        double support = (double) 3.0;
        double[] contrib;
        double[] normContrib;
        double[] tmpContrib;
        int startContrib, stopContrib;
        int nDots;
        int nHalfDots;
    
        public BufferedImage imageZoomOut(BufferedImage srcBufferImage, int w,
                int h, boolean lockScale) {
            width = srcBufferImage.getWidth();
            height = srcBufferImage.getHeight();
            scaleWidth = w;
            if (lockScale) {
                h = w * height / width;
            }
    
            if (DetermineResultSize(w, h) == 1) {
                return srcBufferImage;
            }
            CalContrib();
            BufferedImage pbOut = HorizontalFiltering(srcBufferImage, w);
            BufferedImage pbFinalOut = VerticalFiltering(pbOut, h);
            return pbFinalOut;
        }
    
        /**
         * 决定图像尺寸
         */
        private int DetermineResultSize(int w, int h) {
            double scaleH, scaleV;
            scaleH = (double) w / (double) width;
            scaleV = (double) h / (double) height;
            // 需要判断一下scaleH,scaleV,不做放大操作
            if (scaleH >= 1.0 && scaleV >= 1.0) {
                return 1;
            }
            return 0;
    
        } // end of DetermineResultSize()
    
        private double Lanczos(int i, int inWidth, int outWidth, double Support) {
            double x;
    
            x = (double) i * (double) outWidth / (double) inWidth;
    
            return Math.sin(x * Math.PI) / (x * Math.PI)
                    * Math.sin(x * Math.PI / Support) / (x * Math.PI / Support);
    
        } // end of Lanczos()
    
        //
        // Assumption: same horizontal and vertical scaling factor
        //
        private void CalContrib() {
            nHalfDots = (int) ((double) width * support / (double) scaleWidth);
            nDots = nHalfDots * 2 + 1;
            try {
                contrib = new double[nDots];
                normContrib = new double[nDots];
                tmpContrib = new double[nDots];
            } catch (Exception e) {
                System.out.println("init contrib,normContrib,tmpContrib" + e);
            }
    
            int center = nHalfDots;
            contrib[center] = 1.0;
    
            double weight = 0.0;
            int i = 0;
            for (i = 1; i <= center; i++) {
                contrib[center + i] = Lanczos(i, width, scaleWidth, support);
                weight += contrib[center + i];
            }
    
            for (i = center - 1; i >= 0; i--) {
                contrib[i] = contrib[center * 2 - i];
            }
    
            weight = weight * 2 + 1.0;
    
            for (i = 0; i <= center; i++) {
                normContrib[i] = contrib[i] / weight;
            }
    
            for (i = center + 1; i < nDots; i++) {
                normContrib[i] = normContrib[center * 2 - i];
            }
        } // end of CalContrib()
    
        // 处理边缘
        private void CalTempContrib(int start, int stop) {
            double weight = 0;
    
            int i = 0;
            for (i = start; i <= stop; i++) {
                weight += contrib[i];
            }
    
            for (i = start; i <= stop; i++) {
                tmpContrib[i] = contrib[i] / weight;
            }
    
        } // end of CalTempContrib()
    
        private int GetRedValue(int rgbValue) {
            int temp = rgbValue & 0x00ff0000;
            return temp >> 16;
        }
    
        private int GetGreenValue(int rgbValue) {
            int temp = rgbValue & 0x0000ff00;
            return temp >> 8;
        }
    
        private int GetBlueValue(int rgbValue) {
            return rgbValue & 0x000000ff;
        }
    
        private int ComRGB(int redValue, int greenValue, int blueValue) {
    
            return (redValue << 16) + (greenValue << 8) + blueValue;
        }
    
        // 行水平滤波
        private int HorizontalFilter(BufferedImage bufImg, int startX, int stopX,
                int start, int stop, int y, double[] pContrib) {
            double valueRed = 0.0;
            double valueGreen = 0.0;
            double valueBlue = 0.0;
            int valueRGB = 0;
            int i, j;
    
            for (i = startX, j = start; i <= stopX; i++, j++) {
                valueRGB = bufImg.getRGB(i, y);
    
                valueRed += GetRedValue(valueRGB) * pContrib[j];
                valueGreen += GetGreenValue(valueRGB) * pContrib[j];
                valueBlue += GetBlueValue(valueRGB) * pContrib[j];
            }
    
            valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),
                    Clip((int) valueBlue));
            return valueRGB;
    
        } // end of HorizontalFilter()
    
        // 图片水平滤波
        private BufferedImage HorizontalFiltering(BufferedImage bufImage, int iOutW) {
            int dwInW = bufImage.getWidth();
            int dwInH = bufImage.getHeight();
            int value = 0;
            BufferedImage pbOut = new BufferedImage(iOutW, dwInH,
                    BufferedImage.TYPE_INT_RGB);
    
            for (int x = 0; x < iOutW; x++) {
    
                int startX;
                int start;
                int X = (int) (((double) x) * ((double) dwInW) / ((double) iOutW) + 0.5);
                int y = 0;
    
                startX = X - nHalfDots;
                if (startX < 0) {
                    startX = 0;
                    start = nHalfDots - X;
                } else {
                    start = 0;
                }
    
                int stop;
                int stopX = X + nHalfDots;
                if (stopX > (dwInW - 1)) {
                    stopX = dwInW - 1;
                    stop = nHalfDots + (dwInW - 1 - X);
                } else {
                    stop = nHalfDots * 2;
                }
    
                if (start > 0 || stop < nDots - 1) {
                    CalTempContrib(start, stop);
                    for (y = 0; y < dwInH; y++) {
                        value = HorizontalFilter(bufImage, startX, stopX, start,
                                stop, y, tmpContrib);
                        pbOut.setRGB(x, y, value);
                    }
                } else {
                    for (y = 0; y < dwInH; y++) {
                        value = HorizontalFilter(bufImage, startX, stopX, start,
                                stop, y, normContrib);
                        pbOut.setRGB(x, y, value);
                    }
                }
            }
    
            return pbOut;
    
        } // end of HorizontalFiltering()
    
        private int VerticalFilter(BufferedImage pbInImage, int startY, int stopY,
                int start, int stop, int x, double[] pContrib) {
            double valueRed = 0.0;
            double valueGreen = 0.0;
            double valueBlue = 0.0;
            int valueRGB = 0;
            int i, j;
    
            for (i = startY, j = start; i <= stopY; i++, j++) {
                valueRGB = pbInImage.getRGB(x, i);
    
                valueRed += GetRedValue(valueRGB) * pContrib[j];
                valueGreen += GetGreenValue(valueRGB) * pContrib[j];
                valueBlue += GetBlueValue(valueRGB) * pContrib[j];
            }
    
            valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),
                    Clip((int) valueBlue));
            // System.out.println(valueRGB);
            return valueRGB;
    
        } // end of VerticalFilter()
    
        private BufferedImage VerticalFiltering(BufferedImage pbImage, int iOutH) {
            int iW = pbImage.getWidth();
            int iH = pbImage.getHeight();
            int value = 0;
            BufferedImage pbOut = new BufferedImage(iW, iOutH,
                    BufferedImage.TYPE_INT_RGB);
    
            for (int y = 0; y < iOutH; y++) {
    
                int startY;
                int start;
                int Y = (int) (((double) y) * ((double) iH) / ((double) iOutH) + 0.5);
    
                startY = Y - nHalfDots;
                if (startY < 0) {
                    startY = 0;
                    start = nHalfDots - Y;
                } else {
                    start = 0;
                }
    
                int stop;
                int stopY = Y + nHalfDots;
                if (stopY > (int) (iH - 1)) {
                    stopY = iH - 1;
                    stop = nHalfDots + (iH - 1 - Y);
                } else {
                    stop = nHalfDots * 2;
                }
    
                if (start > 0 || stop < nDots - 1) {
                    CalTempContrib(start, stop);
                    for (int x = 0; x < iW; x++) {
                        value = VerticalFilter(pbImage, startY, stopY, start, stop,
                                x, tmpContrib);
                        pbOut.setRGB(x, y, value);
                    }
                } else {
                    for (int x = 0; x < iW; x++) {
                        value = VerticalFilter(pbImage, startY, stopY, start, stop,
                                x, normContrib);
                        pbOut.setRGB(x, y, value);
                    }
                }
    
            }
    
            return pbOut;
    
        } // end of VerticalFiltering()
    
        int Clip(int x) {
            if (x < 0)
                return 0;
            if (x > 255)
                return 255;
            return x;
        }
    
        public void saveToFile(String imageUrl, String saveUrl) {
            FileOutputStream fos = null;
            BufferedInputStream bis = null;
            HttpURLConnection httpUrl = null;
            URL url = null;
            int BUFFER_SIZE = 1024*10;
            byte[] buf = new byte[BUFFER_SIZE];
            int size = 0;
            try {
                File file = new File(saveUrl);
                File parent = file.getParentFile();
                if (parent != null && !parent.exists()) {
                    parent.mkdirs();
                }
                url = new URL(imageUrl);
                httpUrl = (HttpURLConnection) url.openConnection();
                httpUrl.connect();
                bis = new BufferedInputStream(httpUrl.getInputStream());
                fos = new FileOutputStream(saveUrl);
                while ((size = bis.read(buf)) != -1) {
                    fos.write(buf, 0, size);
                }
                fos.flush();
            } catch (IOException e) {
            } catch (ClassCastException e) {
            } finally {
                try {
                    fos.close();
                    bis.close();
                    httpUrl.disconnect();
                } catch (IOException e) {
                } catch (NullPointerException e) {
                }
            }
        }
    
        /**
         * 处理10M内的图像数据
         * @param fromUrl
         *            源图片地址
         * @param saveUrl
         *            保存地址
         * @param imageW
         *            图片宽度(默认200)
         * @param imageH
         *            图片高度(默认200)
         * @param lockScale
         *            等比缩放
         * @return
         */
    
        public String dealImage(String fromUrl, String saveUrl, int imageW,
                int imageH, boolean lockScale) {
            if (imageW == 0)
                imageW = 200;
            if (imageH == 0)
                imageH = 200;
    
            try {
                saveToFile(fromUrl, saveUrl);
                BufferedImage image1;
                image1 = ImageIO.read(new File(saveUrl));
                BufferedImage image2 = imageZoomOut(image1, imageW, imageH,
                        lockScale);
                FileOutputStream out = new FileOutputStream(saveUrl);
                ImageIO.write(image2, "jpg", out);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return "";
        }
    
        public static void main(String[] args) throws IOException {
            ImageScale is = new ImageScale();
            
            String fromUrl = "http://g3.happimg.com/2012/1129/16/s1_90378.jpg";
            String saveUrl = "c:\t1222_100.jpg";
            is.dealImage(fromUrl, saveUrl, 100, 400,true);
            System.out.println("图片处理完成");
        }
    }

    单独图片下载

    package com.happigo.grab;
    
    import java.io.BufferedInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class downimage {
    
        public void saveToFile(String destUrl) {
            FileOutputStream fos = null;
            BufferedInputStream bis = null;
            HttpURLConnection httpUrl = null;
            URL url = null;
            int BUFFER_SIZE = 1024;
            byte[] buf = new byte[BUFFER_SIZE];
            int size = 0;
            try {
                url = new URL(destUrl);
                httpUrl = (HttpURLConnection) url.openConnection();
                httpUrl.connect();
                bis = new BufferedInputStream(httpUrl.getInputStream());
                fos = new FileOutputStream("c:\haha.gif");
                while ((size = bis.read(buf)) != -1) {
                    fos.write(buf, 0, size);
                }
                fos.flush();
            } catch (IOException e) {
            } catch (ClassCastException e) {
            } finally {
                try {
                    fos.close();
                    bis.close();
                    httpUrl.disconnect();
                } catch (IOException e) {
                } catch (NullPointerException e) {
                }
            }
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            downimage dw = new downimage();
            dw.saveToFile("http://wx.qlogo.cn/mmopen/ajNVdqHZLLBsjJx0OgFI5nmhg2J5PCdUnqoib9jT4AJvxXOsicTpxomH8GXXgUj89hCvvXPWuHP1mibCkP0USzXibQ/0");
        }
    }
  • 相关阅读:
    三角形的个数
    Nightmare(搜索)
    Prime Ring Problem(搜索)
    Safecracker(搜索)
    丑数
    八皇后问题(回溯法)
    Dijkstra
    floyd详解
    继续畅通工程(kruskal prim)
    畅通工程
  • 原文地址:https://www.cnblogs.com/myjoan/p/4275410.html
Copyright © 2011-2022 走看看