百度的缩略图效果, 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]