url转base64

5 篇文章 0 订阅

写在前面:我是在antdProV4的基础上写的demo
1.引入React,useState,useEffect

import React, { useState, useEffect } from 'react';
// 因为umi默认开启的css-Module,路径不能直接写,所以引入图片
import testImg from '@/assets/test.jpg';

2.申明一个state

const [state, setstate] = useState('');

3.书写函数主体,网上看的也是千篇一律,我个人加了Promise,也可以使用async和aweit

/**
   * @description url转Base64
*/
function urlToBase64(url) {
  return new Promise((resolve) => {
    let timeStamp = new Date().getTime();
    //通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片,相比 createElement() 创建 				<img> 省去了 append(),也就避免了文档冗余和污染
    let Img = new Image();
    // 处理缓存,fix缓存bug,有缓存,浏览器会报错;
    Img.src = url + '?' + timeStamp;
    // 解决控制台跨域报错的问题
    Img.crossOrigin = 'Anonymous';
    //获取后缀
    let ext = Img.src.substring(Img.src.lastIndexOf('.') + 1).toLowerCase();
    Img.onload = function () {
      //要先确保图片完整获取到,这是个异步事件
      var canvas = document.createElement('canvas'); //创建canvas元素
      //确保canvas的尺寸和图片一样
      canvas.width = Img.width;
      canvas.height = Img.height;
      //将图片绘制到canvas中
      canvas.getContext('2d').drawImage(Img, 0, 0, Img.width, Img.height);
      //转换图片为dataURL
      resolve(canvas.toDataURL(`image/${ext}`));
    };
  });
}

4.使用部分

<PageContainer content="">
 <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-around' }}>
   <div style={{ width: 750 }}>
     <span>普通地址</span>
     <img src={testImg} style={{ width: '100%' }} alt="" />
   </div>

   <div style={{ width: 750 }}>
     <span>Base64地址</span>
     {/* 这个state就是前面申明的state */}
     <img src={state} style={{ width: '100%' }} alt="" />
   </div>
 </div>
</PageContainer>

5.调用

// 这个例子我是在这里调用的
useEffect(() => {
   	console.log("testImg:",testImg);
    // testImg: /static/test.c50f6919.jpg
    urlToBase64(testImg).then((a) => setstate(a));
}, []);

6.思考
如何通过函数调用,直接返回base64地址,而不需要.then(),欢迎讨论,互相学习

7.本文章所有代码贴上

import React, { useState, useEffect } from 'react';
import { PageContainer } from '@ant-design/pro-layout';
import testImg from '@/assets/test.jpg';

export default function ImgurltoBase64(): React.FC {
  const [state, setstate] = useState('');
  useEffect(() => {
    console.log("testImg:",testImg);
    // testImg: /static/test.c50f6919.jpg
    urlToBase64(testImg).then((a) => setstate(a));
  }, []);
  /**
   * @description url转Base64
  */
  function urlToBase64(url) {
    return new Promise((resolve) => {
      let timeStamp = new Date().getTime();
      //通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片,相比 createElement() 创建 <img> 省去了 append(),也就避免了文档冗余和污染
      let Img = new Image();
      // 处理缓存,fix缓存bug,有缓存,浏览器会报错;
      Img.src = url + '?' + timeStamp;
      // 解决控制台跨域报错的问题
      Img.crossOrigin = 'Anonymous';
      //获取后缀
      let ext = Img.src.substring(Img.src.lastIndexOf('.') + 1).toLowerCase();
      Img.onload = function () {
        //要先确保图片完整获取到,这是个异步事件
        var canvas = document.createElement('canvas'); //创建canvas元素
        //确保canvas的尺寸和图片一样
        canvas.width = Img.width;
        canvas.height = Img.height;
        //将图片绘制到canvas中
        canvas.getContext('2d').drawImage(Img, 0, 0, Img.width, Img.height);
        //转换图片为dataURL
        resolve(canvas.toDataURL(`image/${ext}`));
      };
    });
  }
  return (
    <PageContainer content="">
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-around' }}>
        <div style={{ width: 750 }}>
          <span>普通地址</span>
          <img src={testImg} style={{ width: '100%' }} alt="" />
        </div>

        <div style={{ width: 750 }}>
          <span>Base64地址</span>
          <img src={state} style={{ width: '100%' }} alt="" />
        </div>
      </div>
    </PageContainer>
  );
}

8.实际效果
实际页面效果
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值