1.概述

  Graphics提供了drwaImage(Image image)来绘制位图,该方法需要一个位图做参数。

  步骤:

    1.创建Image的子类对象BufferedImage(int width,int height,int Image Type),这相当于在内存生成了一张图片。

    2.调用BufferedImage的getGraphics()方法获得画笔,此时即可在画布上绘图。

    3.调用paint方法的drawImage方法,一次性的将BufferedImage绘制。

    

  1 import java.awt.*;
2 import java.awt.event.*;
3 import java.awt.image.BufferedImage;
4
5 public class PainterDemo {
6 Frame frame = new Frame("简易手绘");
7
8 private final int WIDTH = 500;
9 private final int HEIGHT = 400;
10
11 private int preX = -1;
12 private int preY = -1;
13
14 PopupMenu colorMenu = new PopupMenu();
15 MenuItem blue = new MenuItem("蓝色");
16 MenuItem red = new MenuItem("红色");
17 MenuItem green = new MenuItem("绿色");
18
19 private Color paintColor = Color.BLACK;
20
21 BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
22 Graphics ig = bi.getGraphics();
23
24 private class MyCanvas extends Canvas{
25 @Override
26 public void paint(Graphics g){
27 g.drawImage(bi,0,0,null);
28 }
29 }
30
31 MyCanvas canvas = new MyCanvas();
32
33
34 public void init(){
35
36 ActionListener ColorListener = new ActionListener() {
37 @Override
38 public void actionPerformed(ActionEvent e) {
39 String command = e.getActionCommand();
40 switch (command){
41 case "蓝色":
42 paintColor = Color.BLUE;
43 break;
44 case "红色":
45 paintColor = Color.RED;
46 break;
47 case "绿色":
48 paintColor = Color.GREEN;
49 break;
50 }
51 }
52 };
53
54 blue.addActionListener(ColorListener);
55 red.addActionListener(ColorListener);
56 green.addActionListener(ColorListener);
57
58 colorMenu.add(blue);
59 colorMenu.add(red);
60 colorMenu.add(green);
61
62 canvas.add(colorMenu);
63 canvas.addMouseListener(new MouseAdapter() {
64 @Override
65 public void mouseReleased(MouseEvent e) {
66 boolean trigger = e.isPopupTrigger();
67 if (trigger){
68 colorMenu.show(canvas,e.getX(),e.getY());
69 }
70
71 preX = -1;
72 preY = -1;
73 }
74 });
75
76 ig.setColor(Color.white);
77 ig.fillRect(0,0,WIDTH,HEIGHT);
78
79 canvas.addMouseMotionListener(new MouseMotionAdapter() {
80 @Override
81 public void mouseDragged(MouseEvent e) {
82 if (preX >= 0 && preY >= 0){
83 ig.setColor(paintColor);
84 ig.drawLine(preX,preY,e.getX(),e.getY());
85 }
86
87 preX=e.getX();
88 preY=e.getY();
89
90 canvas.repaint();
91 }
92 });
93
94 canvas.setPreferredSize(new Dimension(WIDTH,HEIGHT));
95 frame.add(canvas);
96
97 frame.addWindowListener(new WindowAdapter() {
98 @Override
99 public void windowClosing(WindowEvent e) {
100 System.exit(0);
101 }
102 });
103 frame.pack();
104 frame.setVisible(true);
105
106 }
107 public static void main(String[] args) {
108 new PainterDemo().init();
109 }
110 }

2.ImageIO

  实际生活中,有一种情况是程序打开本地的某张图进行编辑,编辑后重新保存在本地,这种情况要使用ImageIO。

方法名 说明
static BufferedImage read(File input) 读取本地图片
static BufferedImage read(inputStream input) 读取本地图片
static boolean write(renderedImage im,String formatName,File output) 在本地磁盘中输出图片
 1 import javax.imageio.ImageIO;
2 import java.awt.*;
3 import java.awt.event.*;
4 import java.awt.image.BufferedImage;
5 import java.io.File;
6 import java.io.IOException;
7
8 public class PhotoViewDemo {
9 Frame frame = new Frame("图片查看器");
10
11 MenuBar menuBar = new MenuBar();
12 Menu menu = new Menu("文件");
13 MenuItem open = new MenuItem("打开",new MenuShortcut(KeyEvent.VK_O));
14 MenuItem save = new MenuItem("保存",new MenuShortcut(KeyEvent.VK_S));
15
16 BufferedImage image;
17
18 private class MyCanvas extends Canvas{
19 @Override
20 public void paint(Graphics g){
21 g.drawImage(image,0,0,null);
22 }
23 }
24
25 MyCanvas canvas = new MyCanvas();
26
27 public void init(){
28
29 open.addActionListener(e ->{
30 FileDialog fileDialog = new FileDialog(frame,"打开图片", FileDialog.LOAD);
31 fileDialog.setVisible(true);
32 String dir = fileDialog.getDirectory();
33 String file = fileDialog.getFile();
34
35 try {
36 image = ImageIO.read(new File(dir,file));
37 canvas.repaint();
38 } catch (IOException ioException) {
39 ioException.printStackTrace();
40 }
41 });
42
43 save.addActionListener(e ->{
44 FileDialog fileDialog = new FileDialog(frame,"保存图片", FileDialog.SAVE);
45 fileDialog.setVisible(true);
46 String dir = fileDialog.getDirectory();
47 String file = fileDialog.getFile();
48
49 try {
50 ImageIO.write(image,"JPEG",new File(dir,file));
51 } catch (IOException ioException) {
52 ioException.printStackTrace();
53 }
54 });
55
56 menu.add(open);
57 menu.add(save);
58 menuBar.add(menu);
59 frame.setMenuBar(menuBar);
60 frame.add(canvas);
61
62 frame.pack();
63 frame.setVisible(true);
64 frame.addWindowListener(new WindowAdapter() {
65 @Override
66 public void windowClosing(WindowEvent e) {
67 System.exit(0);
68 }
69 });
70 }
71 public static void main(String[] args) {
72 new PhotoViewDemo().init();
73 }
74 }

AWT10-位图的更多相关文章

  1. SQLSERVER中NULL位图的作用

    SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Da ...

  2. Oracle位图索引

    索引由KEY和Data组成 位图索引的KEY比普通非唯一性索引多包含一个组成部分,分区,分区是将数据按行由内部机制分段以达到比较好的检索效率 位图索引的Data中,该索引KEY中数据值在分区段中按行分 ...

  3. 基于位图(Bitmap、BitmapData)的图片处理方法(C#)

    目前操作位图的主流方法有三种: 1.基于Bitmap像素的处理方法,以GetPixel()和SetPixel()方法为主.方法调用简单,但是效率偏低. 2.基于内存的像素操作方法,以System.Ru ...

  4. 【读书笔记】《编程珠玑》第一章之位向量&位图

    此书的叙述模式是借由一个具体问题来引出的一系列算法,数据结构等等方面的技巧性策略.共分三篇,基础,性能,应用.每篇涵盖数章,章内案例都非常切实棘手,解说也生动有趣. 自个呢也是头一次接触编程技巧类的书 ...

  5. Atitit 索引技术--位图索引

    Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...

  6. DIB位图(Bitmap)的读取和保存

    设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上.它的文件结构是标准化的,可以在Windows/Linux/Un ...

  7. Oracle索引梳理系列(四)- Oracle索引种类之位图索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  8. Quartz2D 编程指南(四)位图与图像遮罩、CoreGraphics 绘制 Layer

    概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 位图与图像遮罩 简介 位图与图像遮 ...

  9. CDC的StretchBlt函数载入位图时图片失真问题

    最近遇到加载的bmp图片出现失真问题,查找得知需要用SetStretchBltMode函数设置拉伸模式. 函数原型:int SetSTretchBltMode(HDC hdc, int iStretc ...

  10. 位图切割器&位图裁剪器

    位图切割器: 虽然网上有类似的工具,PhotoShop 也有类似功能,但前者似乎不支持超大位图切割(以 G 计大小),而后者的切割块数量好像有比较小的限定范围,于是自己动手写了这个工具. 至于为什么是 ...

随机推荐

  1. 使用Feign发送HTTP请求

    使用Feign发送HTTP请求 在往常的 HTTP 调用中,一直都是使用的官方提供的 RestTemplate 来进行远程调用,该调用方式将组装代码冗余到正常业务代码中,不够优雅,因此在接触到 Fei ...

  2. 了解 MySQL的数据行、行溢出机制吗?

    目录 一.行 有哪些格式? 二.紧凑的行格式长啥样? 三.MySQL单行能存多大体量的数据? 四.Compact格式是如何做到紧凑的? 五.什么是行溢出? 六.行 如何溢出? 七.思考一个问题 关注送 ...

  3. 如何在PDF文档上加水印

    当我们需要传输一些比较重要的文件时,往往会选择将文档转换为PDF文件,避免其他人复制.更改文档的内容. pdfFactory不仅可以为用户提供快速创建PDF的功能,同时还提供了添加水印的功能.有了水印 ...

  4. 获取Win和Linux系统启动时间,类似uptime功能,用于判断是否修改过系统时间

    目录 前言 测试代码 Win测试 Linux测试 总结 前言 有时候需要判断系统是否有修改过时间,最简单的方法就是获取当前时间A,然后sleep X秒,然后获取 时间B,如果 时间B - 时间A ≠ ...

  5. T-SQL——基础语法

    目录 0. 定义变量 1. 批处理 2. 条件逻辑--IF 3. 逻辑分支--CASE 4. 循环语句--WHILE 5. 附录--关于CASE表达式的实现函数 6. 参考 shanzm-2020年1 ...

  6. jvm系列(一)运行时数据区

    C++程序员肩负着每一个对象生命周期开始到终结的维护责任.Java程序员则可以借助自动内存管理机制,不需要自己手动去释放内存.由虚拟机进行内存管理,不容易出现内存泄漏和内存溢出的问题,但是一旦出现这些 ...

  7. 笔记本无法连接校园网,windows诊断显示校园网之未响应

    打开cmd(管理员): 输入以下四条,每一条都按enter ipconfig /flushdns ipconfig /registerdns ipconfig /release ipconfig / ...

  8. CSP-2020 退役记

    CSP-2020 游记 第2次参加CSP-- Day -5~-7 每天笔试+机试 Day -8~-9 在家放松(写作业) Day 0 鸡鸭月考 Day 1 9:30以前 愉快的在别人月考的时候离开鸡鸭 ...

  9. 解决调用WebService报基础连接已经关闭: 服务器关闭了本应保持活动状态的连接的错误的方法

    问题可能原因之一:网速的快慢,我经过测试,如果外网访问的话网速慢就是出现此类问题,但是我没有精确测出当在网络流量最低在什么情况下可以避免此类问题问题可能之二:程序发布之前没把原引用的web servi ...

  10. Linux(宝塔)部署.Net Core完整记录

    前言 最近在V站上看到一个外卖推广的小程序,意思大概是类似淘宝联盟那种,别人走自己的链接后,自己可以抽取大概4%-6%的提成.觉得还蛮有意思的,一开始开源的是静态页面写死的,所以我这边用.Net Co ...