wangzheng3056 发表于 2013-8-2 10:18

百度的缩略图效果, java的图像缩放技术(附代码)

本帖最后由 wangzheng3056 于 2013-8-2 10:19 编辑

        一年前,我接触了图像处理技术,那时候没有老师指导,全靠我一个人去探索。
       当时接了一个项目是为一个网站做缩略图,老师的项目。那个网站是java平台的,负责任不想保存缩略的图片,所以我们只有在后台直接开发一个缩略图的程序。
        那时候我琢磨了一个晚上,最终还是成功了~!下边我用比较学术性的叙述一下我的算法。
        

        图像缩小的算法原理

         表4 原表
        表5 缩小后的表
        取原图中每四个相邻的像素点中的第一个或其他的三个,其分布恰如表4中所示。然后把这些点按照其被取时所在的区域进行排列,就形成了一个新的缩小四倍的图片(如表5)。
      表4代表缩放前的原图,其中网格中的数字编号标记了缩小四倍将要保留的像素点。表4代表了一个6*6大小的图片,表5恰好是其缩小四倍后产生的3*3大小的图片。



        如下图是我讲图像缩放后的效果

        我附上源代码package mainframe;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class mians {
      public static void main(String args[])
      {
              try {
                        frame frames=new frame("略缩图");
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
      }
}




class frame extends JFrame
{       
       
       
        public  static BufferedImage image;
        public static  int  width,height;
        public static int beishu1=2;
       
        public frame(String s) throws IOException
        {
                super(s);
               
                //////////////绘制窗体
                this.setBounds(100,100,500,500);
                this.setLayout(null);
                this.setVisible(true);
             choice list=new choice();
             list.setBounds(300, 400, 100, 40);
             this.add(list);
             list.addItem("1");
             list.addItem("2");
             list.addItem("3");
             list.addItem("4");
             list.addItem("5");
             list.addItem("6");
             list.addItem("7");
             list.addItem("8");
             list.addItem("9");
             list.addItem("10");
             list.addItem("11");
             list.addItemListener(list);
             ///////
            File file=new File("D:\\1234.jpg");
                image=ImageIO.read(file);
                width=image.getWidth();
                height=image.getHeight();


        }
       
       

       
       
    public void drawimage(BufferedImage bi2)
    {
            ////////////////画图
        File file=new File("D:\\ceshi.jpg");
        String format="jpg";
        try {
                        ImageIO.write(bi2, format, file);
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
              Graphics g=this.getGraphics();
             g.clearRect(30, 50, 1500, 1500);
              g.drawImage(
             bi2, // 要画的图片
             30, // 目标矩形的第一个角的x坐标
             50, // 目标矩形的第一个角的y坐标
             30+width, // 目标矩形的第二个角的x坐标
             50+height, // 目标矩形的第二个角的y坐标
             0, // 源矩形的第一个角的x坐标
             0, // 源矩形的第一个角的y坐标
             width, // 源矩形的第二个角的x坐标
             height, // 源矩形的第二个角的y坐标
             this );               

             
    }
   
    class choice extends JComboBox implements ItemListener
    {

                @Override
                public void itemStateChanged(ItemEvent arg0) {
                        // TODO Auto-generated method stub
                        int i=this.getSelectedIndex()+1;
                    try {
                            BufferedImage bi;
                                bi=shortfor(image,i);
                                drawimage(bi);
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                    
                }
           
    }
   
   
    //
        public BufferedImage  shortfor(BufferedImage bi,int beishu ) throws IOException
        {

            int widthd,heightd;
        //四倍略缩
            if(width%beishu!=0)
                    widthd=(width-1)/beishu;
            else widthd=width/beishu;
            if(height%beishu!=0)
                    heightd=(height-1)/beishu;
            else
            heightd=height/beishu;
        //width=widthd;
        //height=heightd;
            
            //初始化欲略缩的缓存
            BufferedImage bi2= new BufferedImage(widthd,heightd,BufferedImage.TYPE_3BYTE_BGR);
            for(int i=0;i<widthd;i++)
                    for(int j=0;j<heightd;j++)
                    {
                            bi2.setRGB(i, j, bi.getRGB(i*beishu, j*beishu));
                    }
              return bi2;
       
        }
        }
大家可以自己任意的更改路径,只要你初始的图片在就可以





      
页: [1]
查看完整版本: 百度的缩略图效果, java的图像缩放技术(附代码)