AWT10-位图
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-位图的更多相关文章
- SQLSERVER中NULL位图的作用
SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Da ...
- Oracle位图索引
索引由KEY和Data组成 位图索引的KEY比普通非唯一性索引多包含一个组成部分,分区,分区是将数据按行由内部机制分段以达到比较好的检索效率 位图索引的Data中,该索引KEY中数据值在分区段中按行分 ...
- 基于位图(Bitmap、BitmapData)的图片处理方法(C#)
目前操作位图的主流方法有三种: 1.基于Bitmap像素的处理方法,以GetPixel()和SetPixel()方法为主.方法调用简单,但是效率偏低. 2.基于内存的像素操作方法,以System.Ru ...
- 【读书笔记】《编程珠玑》第一章之位向量&位图
此书的叙述模式是借由一个具体问题来引出的一系列算法,数据结构等等方面的技巧性策略.共分三篇,基础,性能,应用.每篇涵盖数章,章内案例都非常切实棘手,解说也生动有趣. 自个呢也是头一次接触编程技巧类的书 ...
- Atitit 索引技术--位图索引
Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...
- DIB位图(Bitmap)的读取和保存
设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上.它的文件结构是标准化的,可以在Windows/Linux/Un ...
- Oracle索引梳理系列(四)- Oracle索引种类之位图索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- Quartz2D 编程指南(四)位图与图像遮罩、CoreGraphics 绘制 Layer
概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 位图与图像遮罩 简介 位图与图像遮 ...
- CDC的StretchBlt函数载入位图时图片失真问题
最近遇到加载的bmp图片出现失真问题,查找得知需要用SetStretchBltMode函数设置拉伸模式. 函数原型:int SetSTretchBltMode(HDC hdc, int iStretc ...
- 位图切割器&位图裁剪器
位图切割器: 虽然网上有类似的工具,PhotoShop 也有类似功能,但前者似乎不支持超大位图切割(以 G 计大小),而后者的切割块数量好像有比较小的限定范围,于是自己动手写了这个工具. 至于为什么是 ...
随机推荐
- 通过一道CTF学习HTTP协议请求走私
HTTP请求走私 HTTP请求走私 HTTP请求走私是针对于服务端处理一个或者多个接收http请求序列的方式,进行绕过安全机制,实施未授权访问一种攻击手段,获取敏感信息,并直接危害其他用户. 请求走私 ...
- uniapp自定义picker城市多级联动组件
uniapp自定义picker城市多级联动组件 支持多端--h5.app.微信小程序.支付宝小程序... 支持自定义配置picker插件级数 支持无限级 注意事项:插件传入数据格式为children树 ...
- web文件上传漏洞
什么是文件上传漏洞? 指利用系统的对文件上传部分的控制不足或处理缺陷,上传可执行的动态脚本文件/webShell进行攻击行为. 原因 对于上传文件的后缀名(扩展名)没有做较为严格的限制 对于上传文件的 ...
- Matlab 补充知识
1:disp函数和fprintf函数类似 disp(a) 自动输出a变量的值 disp('dadad') 输出一个字符串 Disp(['a','b','ccc']) 三个字符串连在一起 2:matla ...
- C语言讲义——冒泡排序(bubble sort)
冒泡排序三步走: 循环 交换 回一手 一个数和其它数比较(循环) 每个数都要做这种比较(再一层循环) 准备工作 #include <stdio.h> void sort(int arr[] ...
- Qt5字符串编码转换学习
目录 1.通过Python3示例探索常用字符串编码 UTF8 ANSI Unicode 小结 2.Qt5中使用QTextCodec进行编码转换 小结 1.通过Python3示例探索常用字符串编码 下面 ...
- C语言memset用法
1.函数原型: void *memset(void *str,int c,unsigned long n): 2.参数意义: 第一个参数:数组str的起始地址:第二个参数:要赋值给数组的新值,这个值一 ...
- bootstrap 按钮颜色属性
bootstrap 按钮颜色属性有几种
- 网络拓扑实例09:VRRP组网下同网段内配置基于全局地址池的DHCP服务器
组网图形 DHCP服务器简介 见前面DHCP服务器文章,不再赘述. 组网需求 如图1所示,某企业内的一台主机通过Switch双归属到SwitchA和SwitchB,SwitchA为主设备,作为DHCP ...
- Plant Leaves Classification植物叶子分类:基于孪生网络的小样本学习方法
目录 Abstract Introduction PROPOSED CNN STRUCTURE INITIAL CNN ANALYSIS EXPERIMENTAL STRUCTURE AND ALGO ...