`

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中存储的图像数据
    }
}
分享到:
评论

相关推荐

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

    NULL 博文链接:https://kellhan.iteye.com/blog/1184161

    Java范例开发大全

    《Java范例开发大全》共22章,内容涉及Java开发环境的搭建、Java基础类型与运算符、条件控制语句、异常处理、数组、字符串、输入输出流、面向对象及其四大特征、内部类与接口、Java常用类、集合、多线程编程、Java...

    java范例开发大全(pdf&源码)

    第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...

    java范例开发大全源代码

     第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5 算术运算符 12  实例6...

    java范例开发大全

    第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...

    Java范例开发大全 (源程序)

     第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5 算术运算符 12  实例6 关系...

    Java范例开发大全(全书源程序)

    Java范例开发大全(全书源程序),目录如下: 第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境...

    java源码包---java 源码 大量 实例

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java源码包4

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包3

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包2

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    Java开发技术大全(500个源代码).

    示例描述:本章学习Java的异常处理。 demoException_1.java 异常示例1 demoException_2.java 异常示例2 demoException_3.java 异常示例3 demoException_4.java 异常示例4 demoException_5.java 异常示例5 ...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...

    Google Android SDK开发范例大全的目录

    4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片...

Global site tag (gtag.js) - Google Analytics