BufferedImage类、Image类、Graphics类

BufferedImage

  • Image是一个抽象类,BufferedImage是其实现类,是一个带缓冲区图像类,主要作用是将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等。

      public abstract Graphics getGraphics()//获得在图像上绘图的Graphics对象
    
  • Java将一幅图片加载到内存的方法是:

      String imgPath = "C://demo.jpg";  BufferedImage image = ImageIO.read(new FileInputStream(imgPath));
    
  • 继而可以对图片进行操作,比如,获得图片的宽度:image.getWidth()

  • 图片只有加载到内存中才能进行进一步的处理。

  • RGB:R(红)G(绿)B(蓝)色彩模式是工业界的一种颜色标准。在Java中每个RGB像素所占的位数为8.

  • 创建:

    • 直接调用构造函数
//指定宽高、图像字节灰度BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY)//创建一个不带透明色的对象BufferedImage bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建一个带透明色的对象new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
  • 根据已经存在的BufferedImage对象创建一个copy体
public BufferedImage createBufferedImage(BufferedImage src)
  • 通过创建ColorModel(颜色转换为Java中的像素表示)和Raster(光栅,描述像素的)对象创建BufferedImage对象
public BufferedImage createBufferedImage(int width , int height, byte[] pixels){ //pixel像素ColorModel cm = getColorModel();SampleModel sm = getIndexSampleModel((IndexColorModel)cm, width,height);DataBuffer db = new DataBufferByte(pixels, width*height,0);WritableRaster raster = Raster.creatWritableRaster(sm, db,null);BufferedImage image = new BufferedImage (cm, raster,false, null);return image;}
  • 读取一个图片文件来转换.

    BufferedImage image = ImageIo.read(new FileInputStream(filePath));

  • 保存:找个位置写出去

        File outputfile  = new File("save.png");ImageIO.write(bi,"png",outputfile);  
    
  • Raster和ColorModel对象、BufferedImage的创建与保存

ImageIO

  • 提供read()和write()静态方法,读写图片,比以往的InputStream读写更方便。

BufferedImage与byte数组的转换

  • 在传输中,图片是不能直接传的,需要先转为字节数组再传输较为方便;而字节数组再转回BufferedImage则还原图片。

  • BufferedImage–>byte[]

      ImageIO.write(BufferedImage image,String format,OutputStream out);//format:图片格式,“gif"等;//out:目标;特别的,如果目标为byte数组,则将其预设为ByteArrayOutputStream即可传入此方法,执行完后,只要toByteArray()即可获得byte[].
    
  • byte[]–>bufferedImage

      ByteArrayInputStream in = new ByteArrayInputStream(byte[]b); //将b作为输入流;BufferedImage image = ImageIO.read(InputStream in);//将in作为输入流,读取图片存入image中,而这里in可以为ByteArrayInputStream();
    
  • 参考文章

应用

  • 缓存网络图片

      //获得图片地址Url img = new  URL(url);//获得图片输入流InputStream in = img.openStream();//把输入流转为BufferedImageJPEGImageDecoder decoderFile = JPEGCodec.createJPEGDecoder(in);BufferedImage image = decoderFile.decodeAsBufferedImage();//获得其byte数组ImageIO.write(image, "jpg", bos);//写出InputStream is = new ByteArrayInputStream(os.toByteArray());
    
  • 具体测试与改动

      URL url = new URL("http://www.google.com/intl/en_ALL/images/logo.gif");BufferedImage image = ImageIO.read(url);ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "gif", os);InputStream is = new ByteArrayInputStream(os.toByteArray());
    

Graphics

  • 提供基本绘图和显示格式化文字的方法,画图用的坐标系原点在左上角,纵轴向下。主要有画线段、矩形、圆、椭圆、圆弧、多边形等各种颜色的图形、线条。

  • Graphics2D类提供更强大的绘图能力。

  • 在窗口画一条直线:drawLine(int x1,int y1,int x2,int y2)

      g.drawLine(3,3,50,50);//在(3,3)与(50,50)之间画一条线段g.drawLine(100,100,100,100);//画一个点
    
  • 画折线:drawPolyline(int[],int[],int),各点的x、y坐标,折线数。

  • 画字符串:drawString(String str,int x,int y),x、y是开始显示的位置,使用默认字体、大小、黑色。再写下一行要写在什么位置就很难精确定位了。若要精确定位,则需要知道字符串显示的长度和字高,可以通过FontMetrics类来实现。

      FontMetrics fm = g.getFontMetrics(font); //从Graphics对象获取FontMetrics对象int height = fm.getHeight(); //调用其getHeight()获得字高int width = fm.stringWidth(s1); //获得字符串宽度
    
  • 应用FontMetrics精确定位

      String s1 = "Hello, Java World!";g.setColor(Color.red);setBackground(new Color(0,255,0));Font font = new Font("Arial", Font.BOLD, 18);g.setFont(font);FontMetrics fm = g.getFontMetrics(font);int height = fm.getHeight();int width = fm.stringWidth(s1);int posx =50; int posy = 50;g.drawString(s1 ,posx, posy);g.drawString("I will come in." ,posx +width, posy+height);
    
  • 显示效果

img

  • 设置画笔字体:setFont(Font font);Java有一个类叫GraphicsEnvironment提供绘图环境,其中getAvailableFontFamilyNames()方法可获取程序所在操作系统的所有字体名(是String不是Font)。

      GraphicsEnvironment gv =GraphicsEnvironment.getLocalGraphicsEnvironment();String[] ftNames = gv.getAvailableFontFamilyNames();for (int i=0; i<ftNames.length; i++)Font ft = new Font(ftNames[i], Font.BOLD, 14);
    
  • 设置前景色(画笔颜色):setColor(Color color),选择颜色有两种方法,一是直接用颜色值RGB创建Color对象:Color color=new Color(int R,int G,int B),由于是8位,所以不能超过255;二是用颜色常量如Color.red,Color.green等,Color类提供了13中颜色常量。

  • 设置背景色:setBackground(new Color(int,int,int))

  • 来个写不同字体的小例子

      public void paint (Graphics g){String s1 = "This Font is ";Font font = new Font("Arial", Font.BOLD, 18);g.setColor(Color.red);setBackground(new Color(0,255,0));g.setFont(font);g.drawString(s1 + font.getName() ,20, 60);g.setFont(new Font("隶书", Font.BOLD, 28));g.drawString("现在是隶书" ,20, 120);g.setColor(new Color(0,0,0));}
    
  • 显示效果

img

  • 画矩形:drawRect(int x,int y,int width,int height),画矩形线框,x,y指定了左上角位置,后两个为矩形宽高;fillRect(iny x.int y,int width,int height),指定填充颜色。

      g.drawRect(80,100,40,25);//画线框g.setColor(Color.yellow);g.fillRect(20,70,20,30);//画着色块
    
  • 画圆角矩形:drawRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight),线框,最后两个宽高是圆角弧的横向直径和纵向直径;fillRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight),颜色填充。

      g.drawRoundRect(10,10,150,70,40,25);//画一个圆角矩形g.setColor(Color.blue); g.fillRoundRect(80,100,100,100,60,40);//涂一个圆角矩形块g.drawRoundRect(10,150,40,40,40,40);//画圆g.setColor(Color.red); g.fillRoundRect(80,100,100,100,100,100);//画圆块
    
  • 画三维矩形: draw3DRect(int x,int y,int width,int height,boolean raised),画一个突出显示的矩形(即3D矩形),raise是突出与否;fill3DRect(int x,int y,int width,int height,boolean raised),颜色填充。

      g.draw3DRect(80,100,40,25,true);//画一个线框g.setColor(Color.yellow); g.fill3DRect(20,70,20,30,true);//画一个着色块
    
  • 画椭圆:drawOval(int x,int y,int width,int height),x、y是中心坐标,长轴、短轴;fillOval(int x,int y,int width,int height),填充。

  • 画圆弧:drawArc(int x,int y,int width,int height,int startAngle,int arcAngle),画椭圆一部分的圆弧线,椭圆中心时它的外接矩形的中心,外接矩形左上角坐标为(x,y),宽width,高height,startAngle单位是度,其实角度0度是指3点钟方向,startAngle和arcAngle表示从startAngle角度开始,逆时针方向画arcAngle度的弧,约定,正值度数是逆时针方向,负数为顺时针,例如-90°是6点钟方向;fillArc(int x,int y,int width, int height, int startAngle, int arcAngle),着色。

      g.drawArc(10,40,90,50,0,180);//画圆弧线g.drawArc(100,40,90,50,180,180);//画圆弧线g.setColor(Color.yellow); g.fillArc(10,100,40,40,0,-270);//填充缺右上角的四分之三的椭圆g.setColor(Color.green); g.fillArc(60,110,110,60,-90,-270);//填充缺左下角的四分之三的椭圆
    
  • 画多边形:drawPolygon(int xPoints[],int yPoints[],int nPoints),多边形是多条线段首尾连接而成的封笔平面图,多边形线段端点的x,y坐标存储在两个数组中,画多边形就是按给定的坐标点顺序用直线段将它们连起来,nPoints是坐标点个数;fillPolygon(int xPoints[],int yPoints[],int nPoints),着色。

      int px1[]={50,90,10,50};//首末点相重,才能画多边形int py1[]={10,50,50,10};int px2[]={140,180,170,180,140,100,110,140};int py2[]={5,25,35,45,65,35,25,5};g.setColor(Color.blue);g.fillPolygon(px1,py1,4);g.setColor(Color.red);g.drawPolygon(px2,py2,9);
    
    • 也可以用多边形对象Polygon画多边形

      • Polygon():创建多边形对象,暂时没有坐标点。
      • Polygon(int xPoints[],int yPoints[],int nPoints):用指定的坐标点创建多边形对象。
      • addPoint():将一个坐标点加入到Polygon对象中。
      • drawPolygon(Polygon p):绘制多边形。
      • fillPolygon(Polygon p):和指定的颜色填充多边形。
    • 画一个三角形

    int x[]={140,180,170,180,140,100,110,100}; //用多边形对象不要求首末点重合int y[]={5,25,35,45,65,45,35,25};Polygon ponlygon1=new Polygon();polygon1.addPoint(50,10);polygon1.addPoint(90,50);polygon1.addPoint(10,50);g.drawPolygon(polygon1);g.setColor(Color.yellow);Polygon polygon2 = new Polygon(x,y,8);g.fillPolygon(polygon2);
  • 画图片:drawImage(Image image,int x,int y)

  • 擦除矩形块:clearREct(int x,int y,int width,int height),当需要在一个着色图形中有一个空缺的矩形时,可用背景色填充一矩形块实现,相当于在该图形上使用了橡皮擦。以下代码实现了在一个圆中擦除了一个矩形块

      g.setColor(Color.blue);g.fillOval(50,50,100,100);g.clearRect(70,70,40,55);
    
  • 限定作图显示区域:clipRect(int x,int y,int width,int height),用一个矩形表示图形的显示区域,超出部分不显示,多个限制区有覆盖时,得到交集区域

      g.clipRect(0,0,100,50);g.clipRect(50,25,100,50);
    
  • 复制图形:copyArea(int x,int y,int width,int height,int dx,int dy),dx和dy表示将图形复制到原位置偏移的像素点数,正值为往右或往下偏移,负值为往左或往上偏移,x、y是要复制矩形区域的左上角坐标。以下代码将一个矩形的部分、另一个矩形的全部分别平移

      g.drawRect(10,10,60,90);g.fillRect(90,10,60,90);g.copyArea(40,50,60,70,-20,80);g.copyArea(110,50,60,60,10,80);
    
  • 对Point、Rectangle类的应用

      Point p = new Point(cx / 2, cy / 2); //定义一个点Rectangle rect = new Rectangle((p.x - 40), (p.y - 40), 80, 40); //定义一个矩形int[] xP = {(p.x - 40), (p.x + 90), p.x+200, (p.x - 40)};int[] yP = {(p.y - 40), (p.y +140), (p.y + 60), (p.y-40)};g.drawArc(rect.x, rect.y, rect.width, rect.height * 2, 270, 90); //画弧g.drawPolygon(xP, yP,3); //画多边形g.setColor(Color.red);
    
  • 画图形方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue this.$refs的作用

案例一、ref 写在标签上时 <!-- ref 写在标签上时&#xff1a;this.$refs.名字 获取的是标签对应的dom元素ref 写在组件上时&#xff1a;这时候获取到的是 子组件&#xff08;比如counter&#xff09;的引用--><div id"root"><!-- ref hello&#…

linux电脑合盖后卡住了,解决ubuntu合盖后无法唤醒

解决办法&#xff1a;安装laptop-mode-tools工具包。1.检查是否安装了grep laptop-mode-tools 工具包$ dpkg -l | grep laptop-mode-tools如果执行命令无结果输出&#xff0c;表示未安装(如果已安装&#xff0c;忽略第2步)2.安装laptop-mode执行命令&#xff1a;$ sudo apt-get…

三列布局 css

实现如下图的三列布局&#xff1a; .box {width:1400px;margin:0 auto;padding-bottom:40px;> .left {float:left;width:180px;margin-top:100px;text-align:center;}> .center {float:left;margin-top:100px;margin-left:130px;item-box {float:left;text-align:left;…

axios和ajax的区别是什么

axios和ajax的区别&#xff1a; 1、axios是一个基于Promise的HTTP库&#xff0c;而ajax是对原生XHR的封装&#xff1b; 2、ajax技术实现了局部数据的刷新&#xff0c;而axios实现了对ajax的封装。 axios和ajax的区别是什么? axios和ajax的区别及优缺点: ajax&#xff1a; 1…

VUE学习笔记详细

VUE学习笔记 本文章以vue3来记录的&#xff0c;但并非记录vue3所有变化&#xff01; 1、ES6语法 1.1、let变量声明 let用于声明变量有局部作用域let声明的变量不会提升&#xff08;只能先定义后使用&#xff09; 1.2、const变量声明 const用于声明常量const声明的常量也不会…

Centos7配置gitlab服务器

Centos7配置gitlab服务器 1、安装SSH yum install -y curl policycoreutils-pythonopenssh-server设置开机自启 sudo systemctl enable sshd启动服务 sudo systemctl start sshd2、安装postfix 邮件服务 sudo yum install postfix设置开机自启 sudo systemctl enable po…

Jenkins学习笔记详细

最近接触了jenkins这个东西&#xff0c;所以花点时间了解了下。它可以在代码上传仓库&#xff08;如github,gitee&#xff0c;gitlab&#xff09;后&#xff0c;在jenkins&#xff08;一个网站界面&#xff09;中通过获取代码仓库中最新代码&#xff0c;进行自动化部署&#xf…

Form Data与Request Payload,你真的了解吗?

前言 做过前后端联调的小伙伴&#xff0c;可能有时会遇到一些问题。例如&#xff0c;我明明传递数据给后端了&#xff0c;后端为什么说没收到呢&#xff1f;这时候可能就会就会有小伙伴陷入迷茫&#xff0c;本文从chrome-dev-tools&#xff08;F12调试器&#xff09;中看到的F…

计算机网络知识点复习

基础 1.说下计算机网络体系结构 计算机网络体系结构&#xff0c;一般有三种&#xff1a;OSI 七层模型、TCP/IP 四层模型、五层结构。 简单说&#xff0c;OSI是一个理论上的网络通信模型&#xff0c;TCP/IP是实际上的网络通信模型&#xff0c;五层结构就是为了介绍网络原理而折…

n个1组成的整数能被2013整除c语言,求大神解算法,“编写程序,求n至少为多大时,n个1组成的整数能被2013 整除。”...

编写程序&#xff0c;求n至少为多大时&#xff0c;n个1组成的整数能被2013 整除。使用python黑科技:i 1while int(1 * i) % 2013:i 1print(i)不使用黑科技:i s t 1while s % 2013:i 1t t * 10 % 2013s (s t) % 2013print(i)而事实上可以从数论的角度看。20133*11*61&a…

Java基础知识点复习

转载&#xff1a;https://mp.weixin.qq.com/s/M-6RSRcRd3X93cR7VXpanw Java概述 1.什么是Java&#xff1f; Java是一门面向对象的编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和…

为什么都说Dubbo不适合传输大文件?Dubbo支持的协议

背景 之前公司有一个 Dubbo 服务&#xff0c;内部封装了腾讯云的对象存储服务 SDK&#xff0c;是为了统一管理这种三方服务的SDK&#xff0c;其他系统直接调用这个对象存储的 Dubbo 服务。用来避免因平台 SDK 出现不兼容的大版本更新&#xff0c;导致公司所有系统修改跟着升级…

c语言编写劫持dll,c语言-----劫持自己02

在上一节 c语言-----劫持原理01 已经叙述了劫持原理&#xff0c;下边正式进入劫持实战1. 需要实现的功能在c语言中system("notepad") 可以打开一个记事本system("mspaint") 可以打开画图工具所以这次我们需要把 可以打开一个记事本 这个功能更改为 在控制…

Java中Runtime类

一、概述 Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例&#xff0c;使应用程序能够与其运行的环境相连接。 一般不能实例化一个Runtime对象&#xff0c;应用程序也不能创建自己的 Runtime 类实例&#xff0c;但可以通过 getRuntime 方法获取当前R…

在Java中调用Python

写在前面 在微服务架构大行其道的今天&#xff0c;对于将程序进行嵌套调用的做法其实并不可取&#xff0c;甚至显得有些愚蠢。当然&#xff0c;之所以要面对这个问题&#xff0c;或许是因为一些历史原因&#xff0c;或者仅仅是为了简单。恰好我在项目中就遇到了这个问题&#…

android 导航动画,安利一个Android导航库

SlidingRootNav这是一个像DrawerLayout一样的抽屉式的导航库&#xff0c;这个库实现的抽屉在content view的下层&#xff0c;滑动之后&#xff0c;才能看到相应的导航页使用Gradle添加依赖compile com.yarolegovich:sliding-root-nav:1.0.2使用说明创建一个 content_view.xml或…

android 界面组件,安卓开发学习周第三篇——Android中的UI组件

原标题&#xff1a;安卓开发学习周第三篇——Android中的UI组件在Android APP中&#xff0c;所有的用户界面元素都是由View和ViewGroup的对象构成的。View是绘制在屏幕上的用户能与之交互的一个对象。而ViewGroup则是一个用于存放其他View(和ViewGroup)对象的布局容器&#xff…

BigDecimal.ZERO替代new BigDecimal(0)

这里只是想分享下&#xff0c;平时如果我们想要定义一些BigDecimal类型的变量&#xff0c;可以先看看BigDecimal有没有已经先做了定义&#xff0c;如new BigDecimal(0)就可以用BigDecimal.ZERO来代替&#xff0c;如下&#xff1a; BigDecimal bigDecimal BigDecimal.ZERO;描述…

用js拼html写下拉框,js实现下拉框效果(select)

效果图&#xff1a;代码如下&#xff1a;*{padding: 0;margin:0;}ul,li{list-style: none}.left{float: left;}.right{float: right;}.select_contain{font-size: 14px;color: #333;line-height: 38px;margin: 30px 0;}.select_item{margin-right: 50px;position: relative;}.s…

Gson Builder — 基础 命名策略

文章目录Gson Builder — 基础& 命名策略GsonBuilder 基础命名策略字段命名策略 - IDENTITY字段命名策略 - LOWER_CASE_WITH_UNDERSCORES字段命名策略 - LOWER_CASE_WITH_DASHES字段命名策略 - UPPER_CAMEL_CASE字段命名策略 - UPPER_CAMEL_CASE_WITH_SPACESSerializedName…