java绘制心形爱心

news/2024/12/29 23:28:42/

java绘制心形爱心

  • 绘制java心形的核心就是实现:
  • 上代码:可以直接复制使用
  • 生成效果
    • heart() 展示效果
    • heart2() 展示效果
  • 下面实现另一个需求:
    • 需求描述
    • 要生成二维码,就要引入依赖:
      • 上代码
      • 效果:这个就是包含刘亦菲图片的粉色二维码了
      • 最后附上QRCodeUtil工具类
    • 有什么不懂的,欢迎留言讨论

绘制java心形的核心就是实现:

1.直角坐标系参数方程1
x(t)=a*(2cost-cos(2t))
y(t)=a*(2sint-sin(2t))

2.直角坐标系参数方程2
x = 16*(sin(t))^3 ;
y = 13 * cos(t) - 5 * cos(2t) - 2 * cos(3t) - cos(4t);

上代码:可以直接复制使用


import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;/*** java绘制心形爱心*/
public class Heart2 {public static void main(String[] args) {heart();heart2();}public static  void heart(){//创建一个新的空白BufferedImage对象,800*800BufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);//获取图形绘画工具Graphics2D g2d = bufferedImage.createGraphics();// 设置颜色和画笔粗细g2d.setColor(Color.PINK);g2d.setStroke(new BasicStroke(3.0f));// 在旋转前先绘制文字【在心形镂空处写上文字】,设置文字大小Font font = new Font(null, Font.BOLD, 24);g2d.setFont(font);g2d.drawString("我爱xxx!",350,400);g2d.setColor(Color.RED);//重置画笔颜色// 为了防止生成的心形是倒着放的,创建一个旋转矩阵并旋转180度AffineTransform at = new AffineTransform();at.rotate(Math.toRadians(180), 400, 400); // 以图片中心为旋转中心旋转180度// 将 Graphics2D 上下文变换为旋转后的上下文g2d.setTransform(at);// 定义变量double t = 0;double x, y;// 使用方程绘制心形while (t <= 2 * Math.PI) {x = 16 *Math.pow(Math.sin(t),3) ;y = 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t);//下面这两行将心形放大十倍x*=10;y*=10;g2d.drawLine((int)x + 400, (int)y + 400, (int)x + 400, (int)y + 400);t += 0.01;}g2d.setColor(Color.BLACK);// 释放此图形的上下文以及它使用的所有系统资源g2d.dispose();// 将图片保存到文件系统中try {File outputfile = new File("D:\\heart.png");outputfile.mkdirs();//如果目录有多级,防止父级目录没有创建,我这里放的是D盘根目录ImageIO.write(bufferedImage, "png", outputfile);System.out.println(outputfile.getAbsolutePath()+":绘制成功!");} catch (IOException e) {e.printStackTrace();}}public  static  void heart2(){// 创建一个新的空白BufferedImage对象BufferedImage bufferedImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_ARGB);//获取图形绘画工具Graphics2D g2d = bufferedImage.createGraphics();// 设置颜色和画笔粗细g2d.setColor(Color.RED);g2d.setStroke(new BasicStroke(3.0f));// 为了防止生成的心形是倒着放的,创建一个旋转矩阵并旋转90度AffineTransform at = new AffineTransform();at.rotate(Math.toRadians(90), 400, 400); // 以图片中心为旋转中心旋转90度// 将 Graphics2D 上下文变换为旋转后的上下文g2d.setTransform(at);// 定义变量double t = 0;double x, y;// 使用方程绘制心形while (t <= 2 * Math.PI) {x = Math.cos(2*t)-2*Math.cos(t) ;y = Math.sin(2*t)-2*Math.sin(t) ;//下面这两行将心形放大75倍x*=75;y*=75;g2d.drawLine((int)x + 400, (int)y + 400, (int)x + 400, (int)y + 400);t += 0.01;}// 释放此图形的上下文以及它使用的所有系统资源g2d.dispose();// 将图片保存到文件系统中try {File outputfile = new File("D:\\heart2.png");outputfile.mkdirs();//如果目录有多级,防止父级目录没有创建,我这里放的是D盘根目录ImageIO.write(bufferedImage, "png", outputfile);System.out.println(outputfile.getAbsolutePath()+":绘制成功!");} catch (IOException e) {e.printStackTrace();}}}

生成效果

在这里插入图片描述

heart() 展示效果

在这里插入图片描述

heart2() 展示效果

在这里插入图片描述

在这里插入图片描述
到这里就生成结束了。

下面实现另一个需求:

需求描述

1.编写程序生成一个心形图片
2.上传到服务器,返回图片路径
3.编写程序生成一个二维码,将第二步返回的图片路径写入二维码的文本路径中

要生成二维码,就要引入依赖:

  		<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version></dependency>

上代码


import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class QRCodeGenerator {public static void main(String[] args) {//这里填写第二步返回的图片路径,也可以是自定义的普通文本//我这里就先填写刘亦菲的图片地址了String text = "https://www.douban.com/personage/27255495/photo/2364795372/";//String text ="hello ,二维码!"int width = 300;int height = 300;String format = "png";Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");try {QRCodeWriter writer = new QRCodeWriter();BitMatrix bitMatrix = writer.encode(text, BarcodeFormat.QR_CODE, width, height, hints);File qrFile = new File("D:\\MyQRCode.png");//生成粉色的MatrixToImageConfig config=new MatrixToImageConfig(Color.pink.getRGB(),MatrixToImageConfig.WHITE);MatrixToImageWriter.writeToPath(bitMatrix, format, qrFile.toPath(),config);//MatrixToImageWriter.toBufferedImage(bitMatrix,config);//可以使用这种方式转成一个BufferedImage,然后就可以使用ImageIO了} catch (WriterException | IOException e) {e.printStackTrace();}}
}

效果:这个就是包含刘亦菲图片的粉色二维码了

在这里插入图片描述

最后附上QRCodeUtil工具类


import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;public class QRCodeUtil {/*** 编码** @param content* @param QRcodeWidth* @param QRcodeHeigh* @return* @throws Exception*/public static String encodeQR(String content, int QRcodeWidth, int QRcodeHeigh) throws Exception {QRCodeWriter writer = new QRCodeWriter();//编码格式BarcodeFormat barcodeFormat = BarcodeFormat.QR_CODE;//定义Map集合封装二维码配置信息Map<EncodeHintType, Object> hints = new HashMap<>();//设置二维码图片的内容编码hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 设置二维码图片的上、下、左、右间隙hints.put(EncodeHintType.MARGIN, 1);// 设置二维码的纠错级别hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);BitMatrix bitMatrix = writer.encode(content, barcodeFormat, QRcodeWidth, QRcodeHeigh, hints);// 设置位矩阵转图片的参数MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB());BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix, config);String qrcodeName = "D:\\qrcode.png";ImageIO.write(image, "png", new File(qrcodeName));return qrcodeName;}/*** 解码* @param obj* @return* @throws Exception*/public static String decodeQR(Object obj) throws Exception {BufferedImage image =null;if(obj instanceof File){File file= (File)obj;image = ImageIO.read(file);}if(obj instanceof URL){URL url= (URL)obj;image = ImageIO.read(url);}if(obj instanceof String){String url= (String)obj;image = ImageIO.read(new URL(url));}if(obj instanceof InputStream){InputStream ins= (InputStream)obj;image = ImageIO.read(ins);}if (image == null) {return null;}BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, "utf-8");QRCodeReader reader = new QRCodeReader();result = reader.decode(bitmap, hints);String resultStr = result.getText();return resultStr;}

有什么不懂的,欢迎留言讨论


http://www.ppmy.cn/news/1221718.html

相关文章

【混合编程】Matlab和C++混编

文章目录 编译第一步&#xff1a;使用下面命令编译cpp文件第二步&#xff1a;写mexFunction 在matlab中使用C和C数值传递matlab → \to → cc → \to → matlab 字符串的传入与传出matlab → \to → cc → \to → matlab 编译 第一步&#xff1a;使用下面命令编译cpp文件 …

【ceph】ceph集群中使用多路径(Multipath)方法

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

go-bindata - embed结合嵌入静态文件打包可执行二进制文件

## embed 嵌入静态文件到可执行二进制文件 # 安装go-bindata go get -u github.com/jteeuwen/go-bindata/... # 打包静态文件 go-bindata web/... 执行次命令之后会在项目目录下生成bindata.go文件,示例命令中模板文件都在项目的web目录下 # 使用embed注册模板示例文档 http…

设计模式 -- 工厂模式(Factory Pattern)

工厂模式&#xff1a;属于 创建型模 式&#xff0c;最常用的设计模式之一&#xff0c;提供了一种创建对象的最佳方式。 介绍 意图&#xff1a;定义一个创建对象的接口&#xff0c;让其子类自己决定实例化哪一个工厂类&#xff0c;工厂模式使其创建过程延迟到子类进行。主要解决…

无线WiFi安全渗透与攻防(三) 无线信号探测(目前仅kismet)

这里写目录标题 一. kismet1.软件介绍2.软件使用1.查看kali是否链接了无线网卡2.启动kismet3.查看此时的网卡配置4.访问kismet管理界面5.打开图形窗口,第一次使用时,将会进入用户信息设置界面,如下图:6.填写相关用户信息,第一行用户名,第二行密码,第三行重复密码,设置完…

vue3基础学习(上)

##以前怎么玩的? ###MVC Model:Bean View:视图 Controller ##vue的ref reactive ref:必须是简单类型 reactive:必须不能是简单类型 ###创建一个Vue项目 npm init vuelatest ###生命周期 ###setup相关 ####Vue2的一些写法 -- options API ####Vue3的写法 组合式API Vu…

294_C++_

1、全部大致解析: struct alarminfo_t {unsigned int alarmid;INTF_ALARM_INFO_S pAlarm; };typedef enum{INTF_IO_ALARM_E= 0, //I/O探头告警开始INTF_MOTION_ALARM_E, //移动侦测告警开始INTF_AI_ALARM_E,

MATLAB|科研绘图|山脊图

目录 公众号&#xff1a; 效果图 山脊图介绍 绘图教程 公众号&#xff1a; 效果图 山脊图介绍 山脊图&#xff08;Ridge Plot&#xff09;&#xff0c;也被称为Joy Plot&#xff0c;是一种用于可视化数据分布的图表&#xff0c;特别是用于显示多个组的分布情况。在这种图表…