资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

Java 学习博客

Java 更新时间: 发布时间: 计算机考试归档 最新发布

Java 学习博客

位图

之前只能绘制一些简单的几何图形。Graphics 的 drawImage() 方法可以绘制位图。Image 对象代表位图。

位图使用步骤:

1.创建Image的子类对象 BufferedImage(int width,int height,int ImageType) ,创建时需要指定位图的宽高及类型属性;此时相当于在内存中生成了一张图片;

2.调用 BufferedImage 对象的 getGraphics() 方法获取画笔,此时就可以往内存中的这张图片上绘图了,绘图的方法和之前学习的一模一样(先绘制到内存上);

3.调用组件的 drawImage() 方法,一次性的内存中的图片 BufferedImage 绘制到特定的组件上(内存再绘制到组件上,效率更高些)。

案例:

在画布上用鼠标绘制。右键可以改变红绿蓝三种颜色。

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

public class ImageTry {
    private Frame frame=new Frame("绘制位图");
    private final int AREA_HEIGHT=500;
    private final int AREA_WIDTH=400;
    //右键菜单项
    private PopupMenu colorMenu=new PopupMenu();
    private MenuItem redItem=new MenuItem("红色");
    private MenuItem greenItem=new MenuItem("绿色");
    private MenuItem blueItem=new MenuItem("蓝色");
    //当前画笔颜色
    private Color forceColor=Color.BLACK;
    //上一次画笔位置
    private int preX=-1;
    private int preY=-1;
    BufferedImage image=new BufferedImage(AREA_WIDTH,AREA_HEIGHT,BufferedImage.TYPE_INT_RGB);
    //通过类图获取关联的 Graphics 对象
    private Graphics g= image.getGraphics();
    //画布区域。自定义一个类继承 Canvas
    private class MyCanvas extends Canvas{
        @Override
        public void paint(Graphics g){
            g.drawImage(image,0,0,null);
        }
    }
    MyCanvas drawArea=new MyCanvas();

    public void init(){
        ActionListener listener=new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String command=e.getActionCommand();
                switch (command)
                {
                    case "红色":
                        forceColor= Color.RED;
                        break;
                    case "绿色":
                        forceColor= Color.GREEN;
                        break;
                    case "蓝色":
                        forceColor= Color.BLUE;
                        break;
                    default:
                        break;
                }
            }
        };
        redItem.addActionListener(listener);
        greenItem.addActionListener(listener);
        blueItem.addActionListener(listener);

        colorMenu.add(redItem);
        colorMenu.add(greenItem);
        colorMenu.add(blueItem);
        drawArea.add(colorMenu);
        drawArea.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                if(e.isPopupTrigger()){
                    colorMenu.show(drawArea,e.getX(),e.getY());
                }
                preX=-1;
                preY=-1;
            }
        });

        //设置绘图背景为白色
        g.fillRect(0,0,AREA_WIDTH,AREA_HEIGHT);
        drawArea.setPreferredSize(new Dimension(AREA_WIDTH,AREA_HEIGHT));

        //监听鼠标移动,绘制
        drawArea.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if(preX>=0&&preY>=0){
                    g.setColor(forceColor);
                    g.drawLine(preX,preY,e.getX(),e.getY());
                }
                preX=e.getX();
                preY=e.getY();
                drawArea.repaint();
            }
        });



        frame.add(drawArea);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String[] args){
        new ImageTry().init();
    }
}
ImageIO

位图的读写,非常常用。

实际生活中,很多软件都支持打开本地磁盘已经存在的图片,进行编辑,然后重新保存到本地磁盘。

方法名称方法功能
static BufferedImage read(File input)读取本地磁盘图片文件
static BufferedImage read(InputStream input)读取本地磁盘图片文件
static boolean write(RenderedImage im, String formatName, File output)往本地磁盘中输出图片文件
public class ImageIOTry {

    private Frame frame=new Frame("查看图片");

    private BufferedImage image;

    private class MyCanvas extends Canvas{
        @Override
        public void paint(Graphics g) {
            if(image!=null)
                g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null);
        }
    }

    private MyCanvas drawArea=new MyCanvas();

    public void init() throws Exception{
        MenuBar menubar=new MenuBar();
        Menu menu=new Menu("文件");
        MenuItem mi1=new MenuItem("打开");
        MenuItem mi2=new MenuItem("保存");
        //打开一个文件对话框。gdk 9支持λ表达式,也可以这样写
        mi1.addActionListener(e -> {
            FileDialog fileDialog=new FileDialog(frame,"打开图片");
            fileDialog.setVisible(true);
            String dir= fileDialog.getDirectory();
            System.out.println(dir);
            String file=fileDialog.getFile();
            try {
                image=ImageIO.read(new File(dir,file));//输出图片
                drawArea.repaint();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });
        mi2.addActionListener(e -> {
            FileDialog fileDialog=new FileDialog(frame,"保存图片",FileDialog.SAVE);
            fileDialog.setVisible(true);
            String dir= fileDialog.getDirectory();
            String file=fileDialog.getFile();
            try {
                ImageIO.write(image,"JPEG",new File(dir,file));
                drawArea.repaint();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });
        menu.add(mi1);
        menu.add(new MenuItem("-"));
        menu.add(mi2);
        menubar.add(menu);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.setMenuBar(menubar);
        frame.add(drawArea);
        frame.setBounds(200,200,400,500);
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception {
        new ImageIOTry().init();
    }
}
转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/915325.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【Java 学习博客】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2