用java中的双线性插值方法缩放图像

时间:2016-04-25 02:18:12

标签: java image-processing bytearray bufferedimage bilinear-interpolation

我正在尝试读取图像,将其放大到80 * 60,然后通过双线性插值方法将结果图像缩小5次。但是我得到了这个错误:线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:4800。有人可以帮帮我吗?

这就是我所做的:

import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferByte;
    import java.awt.image.WritableRaster;
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;

    import javax.imageio.ImageIO;

    public class BiInterpolationTest {

        public static int zh;
        public static int zw;


        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub


            int[][] savedImage;

            File  f = new File ("F:\\Java\\Gray Scale Images\\3.jpg"); 
            savedImage = readimage(f);
            BufferedImage grayImage = new BufferedImage(savedImage.length, savedImage[0].length, BufferedImage.TYPE_BYTE_GRAY);

            for (int i =0 ; i<savedImage.length ; i ++){
            for (int j=0 ; j<savedImage[0].length ; j++){
                    int rgb = savedImage[i][j];
                    rgb = (rgb<<16)|(rgb<<8)|(rgb);
                    grayImage.setRGB(i, j, rgb);

                    BufferedImage zoomin =ScaledImage(grayImage, 80,60);
                     zh = zoomin.getHeight();
                     zw = zoomin.getWidth();


            byte[] tempArr;
                tempArr = extractBytes(zoomin);
                    // TODO Auto-generated catch block

            byte [] zoomout;
            zoomout = bilineraInterpolation(tempArr , 5); 
            InputStream in = new ByteArrayInputStream(zoomout);
            BufferedImage bImageInterpolated;
            try {
                bImageInterpolated = ImageIO.read(in);
                ImageIO.write(bImageInterpolated, "jpg", new File(
                        "F:/new-darksouls.jpg"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            }

            }

        }

            public static BufferedImage ScaledImage(Image img, int w , int h){

            BufferedImage resizedImage = new BufferedImage(w , h , BufferedImage.TYPE_BYTE_GRAY);
            Graphics2D g2 = resizedImage.createGraphics();
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2.drawImage(img, 0, 0, w, h, null);
            g2.dispose();
            return resizedImage;
            }
            /////////////////////////////////////
            public static byte[] extractBytes (BufferedImage Image) throws IOException {

                 BufferedImage bufferedImage = new BufferedImage(Image.getHeight(), Image.getWidth(), BufferedImage.TYPE_BYTE_GRAY);

                 // get DataBufferBytes from Raster
                 WritableRaster raster = bufferedImage .getRaster();
                 DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();

                 return ( data.getData() );
                }    


         public static int[][] readimage(File filename){
                BufferedImage img;

                try {
                    img = ImageIO.read(filename);

                    // Gray_scaled Image output

                    int width = img.getWidth();
                    int height = img.getHeight();
                    ImagePro.fw=width;
                    ImagePro.fh = height;
                    int [][] readimageVal = new int [width][height];
                    for (int i = 0; i<height ; i++){
                        for (int j =0  ; j<width ; j++){

                            Color c = new Color(img.getRGB(j, i));
                               int r= (int)(c.getRed() * 0.299)&0xff;
                               int g = (int)(c.getGreen() * 0.587)&0xff;
                               int b = (int)(c.getBlue() *0.114)&0xff;
                               int avg = ((r+b+g));

                            readimageVal[j][i] = avg;
                                }
                                }
                    return readimageVal;

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }


         public static byte[] bilineraInterpolation(byte[] ImgData, int ratio) {

           int wf = zw*ratio;
           int hf = zh*ratio;
           byte[] tempArr = new byte[wf*hf] ;
           int A, B, C, D, x, y, index, g ;
           float x_ratio = ((float)(zw))/wf ;
           float y_ratio = ((float)(zh))/hf ;
           float x_diff, y_diff ;
           int in = 0 ;
           for (int i=0;i<hf;i++) {
               for (int j=0;j<wf;j++) {
                   x = (int)(x_ratio * j) ;
                   y = (int)(y_ratio * i) ;
                   x_diff = (x_ratio * j) - x ;
                   y_diff = (y_ratio * i) - y ;
                   index = y*zw+x ;

                   // range is 0 to 255 thus bitwise AND with 0xff
                   A = ImgData[index] & 0xff ;
                   B = ImgData[index+1] & 0xff ;
                   C = ImgData[index+zw] & 0xff ;
                   D = ImgData[index+zw+1] & 0xff ;

                            g = (int)(
                           A*(1-x_diff)*(1-y_diff) +  B*(x_diff)*(1-y_diff) +
                           C*(y_diff)*(1-x_diff)   +  D*(x_diff*y_diff)
                           ) ;

                   tempArr[in++] = (byte) g ;                                   
               }
           }
           return tempArr ;
       }
         }

0 个答案:

没有答案