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. Hadoop框架:MapReduce基本原理和入门案例

    本文源码:GitHub·点这里 || GitEE·点这里 一.MapReduce概述 1.基本概念 Hadoop核心组件之一:分布式计算的方案MapReduce,是一种编程模型,用于大规模数据集的并行 ...

  2. phpstorm换行符设置LF

    git执行命令行 git config --global core.autocrlf true

  3. 面试官:小伙子,你给我说一下Java Exception 和 Error 的区别吧?

    前言 昨天在整理粉丝给我私信的时候,发现了一个挺有意思的事情.是这样的,有一个粉丝朋友私信问我Java 的 Exception 和 Error 有什么区别呢?说他在面试的时候被问到这个问题卡壳了,最后 ...

  4. 关于GoldWave为Vegas制作音频交叉淡化特效的教程分享

    在Vegas里对音频交叉淡化的处理,是通过将两段音频交叠.调整交叠部分的音量.选取交叉淡化类型这三步来实现的,许多步骤是在音频轨道拖动音量线来实现的,操作上不够灵敏精细.其实,单就音频的交叉淡化处理, ...

  5. ios开发中如何调用苹果自带地图导航

    前段时间一直在赶项目,在外包公司工作就是命苦,天天加班不说,工作都是和工期合同挂钩的,稍微逾期就有可能被扣奖金,不谈这些伤脑筋的事情了,让我们说说iOS开发中如何调用苹果手机自带的地图. 学习如逆水行 ...

  6. 2016湖南省赛 A 2016 题解(同余)

    题目链接 题目大意 给出正整数 n 和 m,统计满足以下条件的正整数对 (a, b) 的数量: 1<=a<=n 1<=b<=m a*b%2016=0 题目思路 我本来以为是容斥 ...

  7. C语言讲义——字符串库函数

    字符串库函数<string.h> 求字符串长度(不含结束符'\0'****) strlen(str) 字符串赋值(可能造成数组越界) strcpy(str," 水浒传 " ...

  8. VisualStudio 编写汇编代码相关设置

    VS编写汇编代码方法 新建空项目,不创建解决方案 项目右键,Build Customizations,选择masm 新建源文件,后缀为.ASM 编写代码 .386 ; Tells MASM to us ...

  9. Beta冲刺随笔——Day_Two

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...

  10. 【2020.12.01提高组模拟】卡特兰数(catalan)

    题目 题目描述 今天,接触信息学不久的小\(A\)刚刚学习了卡特兰数. 卡特兰数的一个经典定义是,将\(n\)个数依次入栈,合法的出栈序列个数. 小\(A\)觉得这样的情况太平凡了.于是,他给出了\( ...