JS绘制图片的两种方法

主要功能:1.上传图片转base64,转好后到控制面板复制;2.webgl绘图;3.2d画布绘图

直接上代码:

<html>
<head>

</head>
<body>
<input type="file" id="fileInput">
<div><img src="" alt="" id="svgBox" width="500"></div>

<div>
    <canvas id="canvas" height="772" width="1621"></canvas>
	<canvas id="mycanvas" height="772" width="1621"></canvas>
</div>
<script>


	function convertImageToBase64(file) {
		return new Promise((resolve, reject) => {
			const reader = new FileReader();
			reader.readAsDataURL(file);
			reader.onload = () => resolve(reader.result);
			reader.onerror = error => reject(error);
		});
	}
	
	let fileInput = document.getElementById('fileInput');
	fileInput.addEventListener('change', (e) => {
		let file = e.target.files[0];
		convertImageToBase64(file)
			.then(base64 => {
				console.log(base64);
			})
			.catch(error => {
				console.error(error);
			});
	});

	let vertexs=new Float32Array([
		-1, 1, 0.0, 0.0, 1.0,
		-1, -1, 0.0, 0.0, 0.0,
		1, 1, 0.0, 1.0, 1.0,
		1, -1, 0.0, 1.0, 0.0]);
	let vertexShaderSource='attribute vec4 a_Position;'+
                'attribute vec2 a_TexCoord;'+
                'varying vec2 v_TexCoord;'+
                'void main(){'+
                'gl_Position = a_Position;'+
                'v_TexCoord = a_TexCoord;'+
            '}';
    let fragmentShaderSource= 'precision mediump float;'+
                'uniform sampler2D u_Sampler;'+
                'varying vec2 v_TexCoord;'+
                'void main(){'+
                    'gl_FragColor = texture2D(u_Sampler, v_TexCoord);'+
            '}';
	let canvas = document.getElementById('canvas');
	let gl = canvas.getContext('webgl');
	let image = new Image();
	
	function initShader() {
      let vertexShader = gl.createShader(gl.VERTEX_SHADER);// 创建顶点着色器
      gl.shaderSource(vertexShader, vertexShaderSource);// 绑定顶点着色器源码
      gl.compileShader(vertexShader);// 编译定点着色器


      let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);// 创建片元着色器
      gl.shaderSource(fragmentShader, fragmentShaderSource);// 绑定片元着色器源码
      gl.compileShader(fragmentShader);// 编译片元着色器

      let shaderProgram = gl.createProgram();// 创建着色器程序
      gl.attachShader(shaderProgram, vertexShader);// 指定顶点着色器
      gl.attachShader(shaderProgram, fragmentShader);// 指定片元着色色器


      gl.linkProgram(shaderProgram);// 链接程序
      gl.useProgram(shaderProgram);//使用着色器
      gl.program = shaderProgram;
      return true
    };
	
	function initVertexs() {

      let vertexsBuffer = gl.createBuffer();


      if (vertexsBuffer === null) {
        console.log("vertexsBuffer is null");
        return false;
      }
      gl.bindBuffer(gl.ARRAY_BUFFER, vertexsBuffer);


      gl.bufferData(gl.ARRAY_BUFFER, vertexs, gl.STATIC_DRAW);

      let a_Position = gl.getAttribLocation(gl.program, "a_Position");
      if (a_Position < 0) {
        console.log("a_Position < 0");
        return false;
      }

      let a_TexCoord = gl.getAttribLocation(gl.program, "a_TexCoord");
      if (a_TexCoord < 0) {
        console.log("a_TexCoord < 0");
        return false;
      }

      //将顶点坐标的位置赋值
      gl.vertexAttribPointer(a_Position, 3, gl.FLOAT, false, vertexs.BYTES_PER_ELEMENT * 5, 0);
      gl.enableVertexAttribArray(a_Position);

      //将纹理坐标赋值
      gl.vertexAttribPointer(a_TexCoord, 2, gl.FLOAT, false, vertexs.BYTES_PER_ELEMENT * 5, vertexs.BYTES_PER_ELEMENT * 3);
      gl.enableVertexAttribArray(a_TexCoord);

      return true;
    };
	
	function initTextures() {

      let textureId = gl.createTexture(); //创建纹理对象

      if (textureId === null) {
        console.log("textureId is null");
        return false;
      }


      gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1); // 对纹理图像进行y轴反转
      gl.activeTexture(gl.TEXTURE0); // 开启0号纹理单元
      gl.bindTexture(gl.TEXTURE_2D, textureId); // 向target绑定纹理对象
      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); // 配置纹理参数
      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);

      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); // 配置纹理图像

      let u_Sampler = gl.getUniformLocation(gl.program, "u_Sampler");
      if (u_Sampler < 0) {
        console.log("u_Sampler < 0");
        return false;
      }
      gl.uniform1i(u_Sampler, 0); // 将0号纹理传递给着色器

      return true
    };
	
	function renderImage() {
      if (!initShader()) {
        console.log('initShader is failed')
        return;
      }
      if (!initVertexs()) {
        console.log('drawVertexs is failed')
        return;
      }
      if (!initTextures()) {
        console.log('drawTextures is failed')
        return;
      }
      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
	  
    };
	
	//1.webgl绘制图片,图片转换为base64格式,这里因为字数限制省略了部分
	image.src="data:image/png;base64,iVBORw0K......m8AAAAASUVORK5CYII=";
	image.setAttribute("crossOrigin", 'Anonymous')
	image.title = '123456.png';
	canvas.append(image);
	image.onload = renderImage;
	//2.画布绘制图片
	var mycanvas = document.getElementById('mycanvas');
	var ctx=mycanvas.getContext('2d');
	var img=new Image();
	img.src=image.src;
	img.titl=image.title;
	img.onload = function() {
    // 当图片加载完成后,绘制图片到canvas上
    // 绘制图片到canvas上,并指定缩放比例
		ctx.drawImage(img, 0, 0, img.width * 0.1, img.height * 0.1);
	};
</script>
</body>
</html>

效果:

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水滴与鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值