JAVA范例 十九) 多媒体与图像处理 (二)

图像处理

实例354 在计算机内存中创建一个图像

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageBuffer extends JFrame {
private JPanel contentPane;
private BorderLayout borderLayout1 = new BorderLayout();
// 创建一个DrawCanvas对象,用于绘制图像
DrawCanvas canvas = new DrawCanvas();
public void initial() {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(500, 500));
this.setTitle("缓冲区图像的示例");
// 添加canvas对象
contentPane.add(this.canvas, BorderLayout.CENTER);
this.setVisible(true);
}
public static void main(String[] args) {
new ImageBuffer().initial();
}
}
class DrawCanvas extends Canvas {
Image image;// 声明将显示的图片
public DrawCanvas() {
// 加载图片
image = this.getToolkit().getImage(
// 没有图片时会报空指针异常,读者在这里要写图片名称,而且图片要存在
ClassLoader.getSystemResource("77.jpg"));
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 1);
try {
mt.waitForAll();
} catch (Exception e) {
e.printStackTrace();
}
if (image.getWidth(this) == -1) {
System.out.println("不能创建图象");
System.exit(-1);
}
this.setBackground(Color.black);
}
public void paint(Graphics g) {
Graphics2D g2D = (Graphics2D) g;
// 创建缓冲区图像
BufferedImage bimage = (BufferedImage) this.createImage(
this.getWidth(), this.getHeight());
// 向缓冲区图像中存储图片数据
bimage.createGraphics().drawImage(this.image, 0, 0, this);
g2D.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
}
}


实例355 会移动的图像

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class MoveImage extends JFrame {
private JPanel contentPane;
private BorderLayout borderLayout = new BorderLayout();
private JLabel jLabel = new JLabel();// 添加JLabel组件
DrawPanel drawPane = new DrawPanel();// 创建DrawPanel的实例
public void initial() {
contentPane = (JPanel) this.getContentPane();
jLabel.setFont(new Font("Dialog", Font.BOLD, 12));
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
jLabel.setText("当鼠标被按下时,小蝴蝶会随着鼠标移动");// 标签的显示文本
contentPane.setLayout(borderLayout);
this.setSize(new Dimension(400, 300));
this.setTitle("会移动的图像");
this.setVisible(true);
contentPane.add(jLabel, BorderLayout.NORTH);
contentPane.add(this.drawPane, BorderLayout.CENTER);// 添加drawPane对象
}
public static void main(String[] args) {
new MoveImage().initial();
}
}
class DrawPanel extends JPanel implements MouseMotionListener {
private int x, y;// 绘制图像的位置坐标
BufferedImage bimage;// 将显示的图像
public DrawPanel() {
this.setBackground(Color.white);// 背景色
this.addMouseMotionListener(this);// 添加鼠标移动监听器
// 加载图片
Image image = this.getToolkit().getImage(
// 这里如果不填写一个存在的图片,程序会抛出空指针异常
ClassLoader.getSystemResource("hu.gif"));
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 1);
try {
mt.waitForAll();
} catch (Exception e) {
e.printStackTrace();
}
if (image.getWidth(this) == -1) {
System.out.println("Could not get the image");
System.exit(-1);
}
// 创建缓冲区图像
bimage = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2D = bimage.createGraphics();
g2D.drawImage(image, 0, 0, this);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
g2D.drawImage(this.bimage, this.x, this.y, this);
}
public void mouseDragged(MouseEvent e) {
this.x = e.getX();// 重新设置位置
this.y = e.getY();
repaint();// 重画
}
public void mouseMoved(MouseEvent arg0) {
}
}


实例356 将图片进行180度旋转

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageRotation extends JFrame {
private JPanel contentPane;
private BorderLayout borderLayout = new BorderLayout();
private JButton jButton = new JButton();// JButton组件
// 创建createPanel的实例
createPanel cp = new createPanel();
private void initial() {
contentPane = (JPanel) this.getContentPane();
// 设置JButton组件
jButton.setFont(new Font("Dialog", Font.BOLD, 12));
jButton.setToolTipText("");
jButton.setText("Turn");
jButton.addActionListener(new ActionListener() {// 添加时间监听器
public void actionPerformed(ActionEvent e) {
jButton_actionPerformed(e);
}
});
contentPane.setLayout(borderLayout);
this.setSize(new Dimension(this.cp.getWidth(), this.cp.getHeight()
+ this.jButton.getHeight()));// 设置窗口大小
this.setTitle("倒置的图像演示");
this.setVisible(true);
contentPane.add(jButton, BorderLayout.SOUTH);// 添加jButton组件
contentPane.add(this.cp, BorderLayout.CENTER);// 添加createPanel对象
this.add(contentPane);
}
public void jButton_actionPerformed(ActionEvent e) {
String cmd = ((JButton) e.getSource()).getActionCommand();
// 如果原来是正常图像
if (cmd.equals("Turn")) {
this.jButton.setText("Turn Back");// 设置按扭新的文本
this.cp.turnBufferedImage();// 旋转图像180度
this.cp.bi1 = this.cp.bi3;// 设置要绘制的缓冲区图像是旋转后的bi3
} else {
this.jButton.setText("Turn");// 设置按扭新的文本
this.cp.turnBufferedImage();// 旋转图像180度
this.cp.bi1 = this.cp.bi3;// 绘制正常时的图像
}
// 重新绘制图像
this.cp.repaint();
}
public static void main(String[] args) {
new ImageRotation().initial();
}
}
class createPanel extends JPanel {
BufferedImage bi1, bi2, bi3;//
public createPanel() {
Image image = this.getToolkit().getImage(
//这里如果不填写一个存在的图片,程序会抛出空指针异常
ClassLoader.getSystemResource("77.jpg"));
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 1);
try {
mt.waitForAll();
} catch (Exception e) {
e.printStackTrace();
}
if (image.getWidth(this) == -1) {
System.out.println("不能创建图象");
System.exit(-1);
}
//
this.setSize(image.getWidth(this), image.getHeight(this));
//
bi2 = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bi2.createGraphics();
g2d.drawImage(image, 0, 0, this);
//
bi1 = bi2;
}
public void turnBufferedImage() {
//
bi3 = new BufferedImage(bi2.getWidth(), bi2.getHeight(), bi2.getType());
//
DataBuffer db1 = bi2.getRaster().getDataBuffer();
DataBuffer db2 = bi3.getRaster().getDataBuffer();
for (int i = db1.getSize() - 1, j = 0; i >= 0; i--, j++) {
db2.setElem(j, db1.getElem(i));
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;//
g2d.drawImage(bi1, 0, 0, this);
}
public void update(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());//
this.paintComponent(g);//
}
}



实例357 处理图像的明暗度

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.LookupOp;
import java.awt.image.LookupTable;
import java.awt.image.ShortLookupTable;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageShading extends JFrame {
private JPanel contentPane;
private BorderLayout borderLayout1 = new BorderLayout();
// 添加的组件
private JPanel jpanel = new JPanel();
private JButton jb1 = new JButton();
private JButton jb2 = new JButton();
private JButton jb3 = new JButton();
private GridLayout gridLayout = new GridLayout();
// 创建ShowPanel类的实例
ShowPanel sp = new ShowPanel();
public void initial() {
// 设置各组件的属性
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(580, 440));
this.setTitle("图像的明暗处理演示");
jb1.setFont(new Font("Dialog", Font.BOLD, 13));
jb1.setText("Brighten");
jb1.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb1_actionPerformed(e);
}
});
jb2.setFont(new Font("Dialog", Font.BOLD, 13));
jb2.setText("Darken");
jb2.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb2_actionPerformed(e);
}
});
jb3.setFont(new Font("Dialog", Font.BOLD, 13));
jb3.setText("Reset");
jb3.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb3_actionPerformed(e);
}
});
jpanel.setLayout(gridLayout);
jpanel.add(jb1, null);
jpanel.add(jb2, null);
jpanel.add(jb3, null);
contentPane.add(jpanel, BorderLayout.SOUTH);
// 在窗口中部添加ShowPanel面板
contentPane.add(sp, BorderLayout.CENTER);
this.setVisible(true);
}
public void jb1_actionPerformed(ActionEvent e) {
sp.brightImage();// 创建变亮查找表
sp.applyFilter();// 变亮源图像
sp.repaint();// 绘制变亮后的图像
}
public void jb2_actionPerformed(ActionEvent e) {
sp.darkImage();// 创建变暗查找表
sp.applyFilter();// 变暗源图像
sp.repaint();// 绘制变暗后的图像
}
public void jb3_actionPerformed(ActionEvent e) {
sp.reset();// 缓冲区图像为源图像
sp.repaint();// 绘制源图像
}
public static void main(String[] args) {
new ImageShading().initial();
}
}
class ShowPanel extends JPanel {
private BorderLayout borderLayout = new BorderLayout();
// 定义新属性
Image image;// 源图像
BufferedImage bi;// 缓冲区图像
Graphics2D g2d;// 图像上下文
LookupTable lut;// 查找表
public ShowPanel() {
this.setLayout(borderLayout);
loadImage();// 加载图片
createBufferedImage();// 创建缓冲区图像
this
.setSize(new Dimension(image.getWidth(this), image
.getHeight(this)));// 设置面板大小
}
public void loadImage() {
// 加载图片
image = this.getToolkit().getImage(
// 这里如果不填写一个存在的图片,程序会抛出空指针异常
ClassLoader.getSystemResource("hua.jpg"));// 创建Image对象
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 1);
try {
mt.waitForAll();
} catch (Exception e) {
e.printStackTrace();// 表示加载失败
}
if (image.getWidth(this) == -1) {
System.out.println("不能创建图象");// 如果不存在退出程序
System.exit(-1);
}
}
public void createBufferedImage() {
// 根据image对象创建一个缓冲区图像
bi = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
// 向缓冲区图像中输入原image对象的图象数据
g2d = bi.createGraphics();
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
}
public void brightImage() {
short[] brighten = new short[256];// 查找表的数据数组
short pixelValue;
for (int i = 0; i < 256; i++) {
pixelValue = (short) (i + 10);// 加亮源像素10个单位值
if (pixelValue > 255) {// 如果源像素加亮后的值超过255,则设为255
pixelValue = 255;
} else if (pixelValue < 0) {// 如果源像素加亮后的值低于0,则设为0
pixelValue = 0;
}
brighten[i] = pixelValue;// 赋值
}
lut = new ShortLookupTable(0, brighten);// 创建新的查找表,该表加亮源图像
}
public void darkImage() {
short[] darken = new short[256];// 查找表的数据数组
short pixelValue;
for (int i = 0; i < 256; i++) {
pixelValue = (short) (i - 10);// 变暗源像素10个单位值
if (pixelValue > 255) {// 如果源处理后的像素值超过255,则设为255
pixelValue = 255;
} else if (pixelValue < 0) {// 如果处理后的像素值低于0,则设为0
pixelValue = 0;
}
darken[i] = pixelValue;// 赋值
}
lut = new ShortLookupTable(0, darken);// 创建新的查找表,该表变暗源图像
}
public void reset() {
g2d.setColor(Color.black);
g2d.clearRect(0, 0, image.getWidth(this), image.getHeight(this));
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
}
public void applyFilter() {
LookupOp lop = new LookupOp(lut, null);// 根据查找表,创建查找过滤器
lop.filter(bi, bi);// 过滤图像
}
public void update(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());
paintComponent(g);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(bi, 0, 0, this);
}
}


实例358 如何将彩色图转化为灰度图

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.color.ColorSpace;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GrayImage extends JFrame {
private JPanel contentPane;
private BorderLayout borderLayout1 = new BorderLayout();
// 添加的组件
private JPanel jpanel = new JPanel();
private JButton jb1 = new JButton();
private JButton jb2 = new JButton();
private GridLayout gridLayout = new GridLayout();
DisplayPanel dp = new DisplayPanel();
public void initial() {
// 设置各组件的属性
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(580, 440));
this.setTitle("图像的色彩处理演示");
jb1.setFont(new Font("Dialog", Font.BOLD, 13));
jb1.setText("Gray Image");
jb1.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb1_actionPerformed(e);
}
});
jb2.setFont(new Font("Dialog", Font.BOLD, 13));
jb2.setText("Reset");
jb2.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb2_actionPerformed(e);
}
});
jpanel.setLayout(gridLayout);
jpanel.add(jb1, null);
jpanel.add(jb2, null);
contentPane.add(jpanel, BorderLayout.SOUTH);
// 在窗口中部添加DisplayPanel面板
contentPane.add(dp, BorderLayout.CENTER);
this.setVisible(true);
}
public void jb1_actionPerformed(ActionEvent e) {
dp.toChange();// 灰化图像
dp.repaint();// 绘制灰化后的图像
}
public void jb2_actionPerformed(ActionEvent e) {
dp.reset();// 缓冲区图像设为源图像
dp.repaint();// 绘制源图像
}
public static void main(String[] args) {
new GrayImage().initial();
}
}
class DisplayPanel extends JPanel {
private BorderLayout borderLayout = new BorderLayout();
// 定义新属性
Image image;// 源图像
BufferedImage bi;// 缓冲区图像
Graphics2D g2d;// 图像上下文
public DisplayPanel() {
this.setLayout(borderLayout);
loadImage();// 加载图片
createBufferedImage();// 创建缓冲区图像
this
.setSize(new Dimension(image.getWidth(this), image
.getHeight(this)));// 设置面板大小
}
public void loadImage() {
// 加载图片
image = this.getToolkit().getImage(
ClassLoader.getSystemResource("hua.jpg"));// 创建Image对象,这里的图片读者可以自定义
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 1);
try {
mt.waitForAll();
} catch (Exception e) {
e.printStackTrace();// 表示加载失败
}
if (image.getWidth(this) == -1) {
System.out.println("不能创建图象");// 如果不存在退出程序
System.exit(-1);
}
}
public void createBufferedImage() {
// 根据image对象创建一个缓冲区图像
bi = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
// 向缓冲区图像中输入原image对象的图象数据
g2d = bi.createGraphics();
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
}
public void reset() {
g2d.setColor(Color.black);
g2d.clearRect(0, 0, image.getWidth(this), image.getHeight(this));
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
}
public void update(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());
paintComponent(g);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(bi, 0, 0, this);
}
public void toChange() {
// 创建灰化颜色转换器
ColorConvertOp cco = new ColorConvertOp(ColorSpace
.getInstance(ColorSpace.CS_GRAY), null);
cco.filter(bi, bi);// 将原缓冲区图像的像素灰化后,重新存入缓冲区图像中
}
}

实例359 锐化和模糊图像

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class SharpenFuzzy extends JFrame {
private JPanel contentPane;
private BorderLayout borderLayout1 = new BorderLayout();
// 添加的组件
private JPanel jpanel = new JPanel();
private JButton jb1 = new JButton();
private JButton jb2 = new JButton();
private JButton jb3 = new JButton();
private GridLayout gridLayout = new GridLayout();
// 创建ShowPanel类的实例
PanelDemo pd = new PanelDemo();
public void initial() {
// 设置各组件的属性
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(380, 550));
this.setTitle("图像的明暗处理演示");
jb1.setFont(new Font("Dialog", Font.BOLD, 13));
jb1.setText("Sharp Image");
jb1.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb1_actionPerformed(e);
}
});
jb2.setFont(new Font("Dialog", Font.BOLD, 13));
jb2.setText("Biur Image");
jb2.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb2_actionPerformed(e);
}
});
jb3.setFont(new Font("Dialog", Font.BOLD, 13));
jb3.setText("Reset");
jb3.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb3_actionPerformed(e);
}
});
jpanel.setLayout(gridLayout);
jpanel.add(jb1, null);
jpanel.add(jb2, null);
jpanel.add(jb3, null);
contentPane.add(jpanel, BorderLayout.SOUTH);
// 在窗口中部添加ShowPanel面板
contentPane.add(pd, BorderLayout.CENTER);
this.setVisible(true);
}
public void jb1_actionPerformed(ActionEvent e) {
pd.sharpImage();// 调用锐化方法
pd.repaint();// 绘制锐化后的图像
}
public void jb2_actionPerformed(ActionEvent e) {
pd.blurImage();// 调用模糊方法
pd.repaint();// 绘制模糊后的图像
}
public void jb3_actionPerformed(ActionEvent e) {
pd.reset();// 缓冲区图像为源图像
pd.repaint();// 绘制源图像
}
public static void main(String[] args) {
new SharpenFuzzy().initial();
}
}
class PanelDemo extends JPanel {
private BorderLayout borderLayout = new BorderLayout();
// 定义新属性
Image image;// 源图像
BufferedImage bi1;// 缓冲区图像
BufferedImage bi2;// 缓冲区图像
BufferedImage bi3;// 缓冲区图像
Graphics2D g2d;// 图像上下文
public PanelDemo() {
this.setLayout(borderLayout);
loadImage();// 加载图片
createBufferedImage();// 创建缓冲区图像
bi1 = bi2;
this
.setSize(new Dimension(image.getWidth(this), image
.getHeight(this)));// 设置面板大小
}
public void loadImage() {
// 加载图片
image = this.getToolkit().getImage(
// 这里如果不填写一个存在的图片,程序会抛出空指针异常
ClassLoader.getSystemResource("chaojikatong.jpg"));// 创建Image对象
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 0);
try {
mt.waitForAll();
} catch (Exception e) {
e.printStackTrace();// 表示加载失败
}
if (image.getWidth(this) == -1) {
System.out.println("不能创建图象");// 如果不存在退出程序
System.exit(1);
}
}
public void createBufferedImage() {
// 根据image对象创建一个缓冲区图像
bi2 = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
// 向缓冲区图像中输入原image对象的图象数据
g2d = bi2.createGraphics();
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
// 创建另一个空的缓冲区图像,大小和类型相同的bi3
bi3 = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
}
public void sharpImage() {// 锐化图像的方法
float[] data = { -1.0f, -1.0f, -1.0f, 10.f, -1.0f, -1.0f, -1.0f, -1.0f };
Kernel kernel = new Kernel(3, 3, data);
ConvolveOp co = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);// 创建卷积过滤器
co.filter(bi2, bi3);// 将存储源图像的缓冲区图像的数据经卷积过滤器处理后进入另一个缓冲区
bi1 = bi3;// bi1指向处理后的图像缓冲区bi3
}
public void blurImage() {// 模糊图像的方法
float[] data = { 0.0625f, 0.125f, 0.0625f, 0.125f, 0.25f, 0.125f,
0.0625f, 0.125f, 0.0625f };
Kernel kernel = new Kernel(3, 3, data);
ConvolveOp co = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);// 创建卷积过滤器
co.filter(bi2, bi3);// 将存储源图像的缓冲区图像的数据经卷积过滤器处理后进入另一个缓冲区
bi1 = bi3;// bi1指向处理后的图像缓冲区bi3
}
public void reset() {
g2d.setColor(Color.black);
g2d.clearRect(0, 0, image.getWidth(this), image.getHeight(this));
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
// 令bi1对象指向源图像存储的bi2缓冲区图像
bi1 = bi2;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(bi1, 0, 0, this);
}
public void update(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());
this.paintComponent(g);
}
}


实例360 显示一个图像的轮廓

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageProfile extends JFrame {
private JPanel contentPane;
private BorderLayout borderLayout1 = new BorderLayout();
// 添加的组件
private JPanel jpanel = new JPanel();
private JButton jb1 = new JButton();
private JButton jb2 = new JButton();
private GridLayout gridLayout = new GridLayout();
PanelDemo_1 pd = new PanelDemo_1();
public void initial() {
// 设置各组件的属性
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(350, 560));
this.setTitle("图像的锐化与模糊处理演示");
jb1.setFont(new Font("Dialog", Font.BOLD, 13));
jb1.setText("Image Edge");
jb1.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb1_actionPerformed(e);
}
});
jb2.setFont(new Font("Dialog", Font.BOLD, 13));
jb2.setText("Reset");
jb2.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb2_actionPerformed(e);
}
});
jpanel.setLayout(gridLayout);
jpanel.add(jb1, null);
jpanel.add(jb2, null);
contentPane.add(jpanel, BorderLayout.SOUTH);
// 在窗口中部添加PanelDemo_1面板
contentPane.add(pd, BorderLayout.CENTER);
this.setVisible(true);
}
public void jb1_actionPerformed(ActionEvent e) {
pd.detectImageEgde();// 显示图像轮廓
pd.repaint();// 绘制显示图像轮廓后的图像
}
public void jb2_actionPerformed(ActionEvent e) {
pd.reset();// 缓冲区图像设为源图像
pd.repaint();// 绘制源图像
}
public static void main(String[] args) {
new ImageProfile().initial();
}
}
class PanelDemo_1 extends JPanel {
private BorderLayout borderLayout = new BorderLayout();
// 定义新属性
Image image;// 源图像
BufferedImage bi1;// 缓冲区图像
BufferedImage bi2;// 缓冲区图像
BufferedImage bi3;// 缓冲区图像
Graphics2D g2d;// 图像上下文
public PanelDemo_1() {
this.setLayout(borderLayout);
loadImage();// 加载图片
createBufferedImage();// 创建缓冲区图像
bi1 = bi2;
this
.setSize(new Dimension(image.getWidth(this), image
.getHeight(this)));// 设置面板大小
}
public void loadImage() {
// 加载图片
image = this.getToolkit().getImage(
//这里读者如果不填写一个存在的图片名,程序会抛出空指针异常
ClassLoader.getSystemResource("chaojikatong.jpg"));// 创建Image对象
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 0);
try {
mt.waitForAll();
} catch (Exception e) {
e.printStackTrace();// 表示加载失败
}
if (image.getWidth(this) == -1) {
System.out.println("不能创建图象");// 如果不存在退出程序
System.exit(1);
}
}
public void detectImageEgde() {
float[] data = { 1.0f, 0.0f, -0.9f, 1.0f, 0.0f, -0.9f, 1.0f, 0.0f,
-0.9f };
Kernel kernel = new Kernel(3, 3, data);
ConvolveOp co = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);// 创建卷积过滤器
co.filter(bi2, bi3);// 将存储源图像的缓冲区图像的数据经卷积过滤器处理后进入另一个缓冲区
bi1 = bi3;// bi1指向处理后的图像缓冲区bi3
}
public void createBufferedImage() {
// 根据image对象创建一个缓冲区图像
bi2 = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
// 向缓冲区图像中输入原image对象的图象数据
g2d = bi2.createGraphics();
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
// 创建另一个空的缓冲区图像,大小和类型相同的bi3
bi3 = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
}
public void reset() {
g2d.setColor(Color.black);
g2d.clearRect(0, 0, image.getWidth(this), image.getHeight(this));
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
// 令bi1对象指向源图像存储的bi2缓冲区图像
bi1 = bi2;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(bi1, 0, 0, this);
}
public void update(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());
this.paintComponent(g);
}
}

实例361 如何放大及拉伸图像

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class TensileZoom extends JFrame {
private JPanel contentPane;
private BorderLayout borderLayout1 = new BorderLayout();
// 添加的组件
private JPanel jpanel = new JPanel();
private JButton jb1 = new JButton();
private JSlider js1 = new JSlider();
private JSlider js2 = new JSlider();
private Border border1;
private Border border2;
private TitledBorder titleBorder1;
private TitledBorder titleBorder2;
private GridLayout gridLayout = new GridLayout();
PanelDemo_2 pd2 = new PanelDemo_2();
public void initial() {
contentPane = (JPanel) this.getContentPane();
border1 = BorderFactory.createEmptyBorder();
border2 = BorderFactory.createEmptyBorder();
titleBorder1 = new TitledBorder(border1, "水平方向的缩放");
titleBorder2 = new TitledBorder(border2, "垂直方向的缩放");
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(600, 480));
this.setTitle("图像的伸展和缩放演示");
jb1.setFont(new Font("Dialog", Font.BOLD, 13));
jb1.setText("重置");
jb1.addActionListener(new ActionListener() {// 添加事件监听器
public void actionPerformed(ActionEvent e) {
jb1_actionPerformed(e);
}
});
js1.setPaintLabels(true);
js1.setBorder(titleBorder1);
js1.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
js1_stateChanged(e);
}
});
js2.setBorder(titleBorder2);
js2.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
js2_stateChanged(e);
}
});
gridLayout.setColumns(1);
gridLayout.setRows(3);
contentPane.add(jpanel, BorderLayout.SOUTH);
jpanel.add(js1, null);
jpanel.add(js2, null);
jpanel.add(jb1, null);
// 在窗口中部添加PanelDemo_2面板
contentPane.add(pd2, BorderLayout.CENTER);
this.setVisible(true);
}
public void jb1_actionPerformed(ActionEvent e) {
pd2.reset();
pd2.repaint();
}
public void js1_stateChanged(ChangeEvent e) {
// 设置新的X轴上的缩放比例,变换图像,并绘制相应的图像
double scafex = ((double) ((JSlider) e.getSource()).getValue()) / 100;
System.out.println("X" + " " + scafex);
pd2.scafeX = scafex;
pd2.applyFilter();
pd2.repaint();
}
public void js2_stateChanged(ChangeEvent e) {
// 设置新的Y轴上的缩放比例,变换图像,并绘制相应的图像
double scafey = ((double) ((JSlider) e.getSource()).getValue()) / 100;
System.out.println("Y" + " " + scafey);
pd2.scafeY = scafey;
pd2.applyFilter();
pd2.repaint();
}
public static void main(String[] args) {
new TensileZoom().initial();
}
}
class PanelDemo_2 extends JPanel {
private BorderLayout borderLayout = new BorderLayout();
// 定义新属性
Image image;// 源图像
BufferedImage bi1;// 缓冲区图像
BufferedImage bi2;// 缓冲区图像
BufferedImage bi3;// 缓冲区图像
Graphics2D g2d;// 图像上下文
AffineTransform transform = new AffineTransform();// 一个仿射变换过滤器
double scafeX = 1.0;// x轴上的缩放比例
double scafeY = 1.0;// Y轴上的缩放比例
public PanelDemo_2() {
this.setLayout(borderLayout);
loadImage();// 加载图片
createBufferedImage();// 创建缓冲区图像
bi1 = bi2;
this
.setSize(new Dimension(image.getWidth(this), image
.getHeight(this)));// 设置面板大小
}
public void loadImage() {
// 加载图片
image = this.getToolkit().getImage(
//这里如果不填写一个存在的图片,程序会抛出空指针异常
ClassLoader.getSystemResource("hua.jpg"));// 创建Image对象
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 0);
try {
mt.waitForAll();
} catch (Exception e) {
e.printStackTrace();// 表示加载失败
}
if (image.getWidth(this) == -1) {
System.out.println("不能创建图象");// 如果不存在退出程序
System.exit(1);
}
}
public void createBufferedImage() {
// 根据image对象创建一个缓冲区图像
bi2 = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
// 向缓冲区图像中输入原image对象的图象数据
g2d = bi2.createGraphics();
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
// 创建另一个空的缓冲区图像,大小和类型相同的bi3
bi3 = new BufferedImage(image.getWidth(this), image.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
}
public void reset() {
g2d.setColor(Color.black);
g2d.clearRect(0, 0, image.getWidth(this), image.getHeight(this));
g2d.drawImage(this.image, 0, 0, this);// 绘制缓冲区图像
// 令bi1对象指向源图像存储的bi2缓冲区图像
bi1 = bi2;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(bi1, 0, 0, this);
}
public void update(Graphics g) {
g.clearRect(0, 0, this.getWidth(), this.getHeight());
this.paintComponent(g);
}
public void applyFilter() {
transform.setToScale(this.scafeX, this.scafeY);// 设置变换在x、y轴上的缩放比例
// 创建一个仿射变换过滤器
AffineTransformOp ato = new AffineTransformOp(transform, null);
// 清空bi3缓冲区图像中的数据
bi3.createGraphics().clearRect(0, 0, bi3.getWidth(this),
bi3.getHeight(this));
// 利用过滤器塓滤源图像,并将得到的处理后图像数据存入bi3中
ato.filter(bi2, bi3);
bi1 = bi3;// 令bi1指缶bi3对象,以便显示bi3中存储的图像数据
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值