CSDN话题挑战赛第2期
参赛话题: 学习笔记

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?

在vue中的代码:

methods: {
	onOK() {
		//调用转换方法 svgBase64为svgbase64的数据 格式:data:image/svg+xml;base64,..................
		let pngBase64Fun = this.svgBase64ToPngBase64(svgBase64);
		pngBase64Fun.then((res) => {
			// 将svg base64转 pngbase64后执行回调函数,res 为转换后的png base64
			this.$emit('callBack', res);//res数据 格式:data:image/png;base64,.......
	// 实现 svgBase64 转pngBase64核心代码
    async svgBase64ToPngBase64(imageBase64){
	  const img = new Image(); // 创建图片容器
	  img.src = imageBase64; //imageBase64 为svg+xml的Base64 文件流
		var promise = new Promise((reslove)=>{
			img.onload = function(){
			  // 图片创建后再执行,转Base64过程
			  const canvas = document.createElement('canvas');
			  canvas.width = 660;  //设置好 宽高  不然图片 不完整
			  canvas.height = 300;
			  const context = canvas.getContext('2d');
			  context.drawImage(img, 0, 0);
			  let pngBase64 = canvas.toDataURL('image/png');
			  reslove(pngBase64);
		return await promise;

温馨提示 : 如果是在uniapp中封装APP则转换方案不行,因为在APP中不支持 Image() 对象。可以上传到后台svg图片后,根据需要转png。

java 后台接收并转换成图片:

@ResponseBody
@PostMapping("/uploadSignImage")
public AjaxResult uploadSignImage(HttpServletRequest request){
        Long projectId = Long.parseLong(request.getParameter("projectId"));
        Long signUserId = Long.parseLong(request.getParameter("signUserId"));
        String pngBase6 = request.getParameter("imgBase64");
        // 签名文件的路径
        String filePath = RuoYiConfig.getUploadPath()+"/"+DateUtils.datePath();
        File dir = new File(filePath);
        if(!dir.exists())
            dir.mkdirs();
        String signedFileName = "sign"+projectId+".png";
        String existFileUrl = ImageUtils.GenerateImage(pngBase6, filePath+"/"+ signedFileName);
        if(StringUtils.isNotEmpty(existFileUrl))
            int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
            String currentDir = StringUtils.substring(existFileUrl, dirLastIndex);
            String signedFileUrl = serverConfig.getUrl() + Constants.RESOURCE_PREFIX + "/" + currentDir;
            //更新数据库逻辑
            // if(res>0)
            //     return AjaxResult.success("图片上传成功!");
            return AjaxResult.success("图片上传成功!");
        return AjaxResult.error("图片上传失败,请稍后重试!");
    }catch (Exception e) {
        e.printStackTrace();
        return AjaxResult.error("图片上传失败,请稍后重试!");

ImageUtils.java 工具类

* 对 png Base64解码并转成图片 * @param imgData * @param imgFilePath * @return * @throws IOException public static String GenerateImage(String imgData, String imgFilePath) throws IOException { // 对字节数组字符串进行Base64解码并生成图片 if (imgData == null) // 图像数据为空 return null; imgData = imgData.replace("data:image/png;base64,",""); BASE64Decoder decoder = new BASE64Decoder(); OutputStream out = null; try { out = new FileOutputStream(imgFilePath); // Base64解码 byte[] b = decoder.decodeBuffer(imgData); for (int i = 0; i < b.length; ++i) { if (b[i] < 0) {// 调整异常数据 b[i] += 256; out.write(b); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } finally { out.flush(); out.close(); return imgFilePath;
私信