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 }

浙公网安备 33010602011771号