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. linux打包 压缩 解压tar常归操作

    tar 打包 tar -cvf 打包后路径和文件名.tar 需要打包的路径和文件压缩 tar -zcvf 打包后路径和文件名.tar.gz 需要打包的路径和文件解压 tar -xvf 包名 -C 路径 ...

  2. 新建Chrome标签页,极简+自用

    [跳转GitHub] chromeNewTab 已经入坑Chrome应用开发者,可以去:[应用商店地址]直接添加使用. 使用说明 下载chrome的一个[window组策略文件],解压文件后找到(\p ...

  3. Hadoop大数据平台搭建之前期配置(1)

    环境:CentOS 7.4 (1708  DVD) 工具:VMware.MobaXterm 一. 网络配置 1. 在VMware中安装虚拟机,此步骤不作赘述. 2. 镜像文件保留在固定目录下,网络适配 ...

  4. nginx转发php文件到php-fpm服务器提示502错误

    实验将php文件转发给另一个php-fpm服务器处理的时候,出现了502错误: 检查了nginx错误日志,提示: 2019/08/25 17:54:56 [error] 4742#0: *35 rec ...

  5. java数组作为函数返回值

    1 //将一个二维数组行和列元素互换.存到另一个二维数组 2 package test; 3 4 public class test1_8 { 5 public static int[][] huhu ...

  6. LaTex源文件的基本结构

    默认编译器设置: Utf-8设置: 相关代码与注释: 显示效果:

  7. uni-app 封装接口request请求

    我们知道一个项目中对于前期架构的搭建工作对于后期的制作有多么重要,所以不管做什么项目我们拿到需求后一定要认真的分析一下,要和产品以及后台沟通好,其中尤为重要的一个环节莫过于封装接口请求了.因为前期封装 ...

  8. java46

    1.迭代器遍历 import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public c ...

  9. oracle sql%notfound

    SQL%NOTFOUND 是一个布尔值.与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true.否则返回fal ...

  10. 《技术男征服美女HR》—Fiber、Coroutine和多线程那些事

    1.起点 我叫小白,坐在这间属于华夏国超一流互联网公司企鹅巴巴的小会议室里,等着技术面试官的到来. 令我感到不舒服的,是坐在我对面的那位HR美女一个劲儿的盯着我打量!虽说本人帅气,但是也不能这么毫无顾 ...