js 上传图片等比例缩放

实际问题:

在JavaScript中,可以使用HTML5的Canvas元素以及相关的API来实现图片等比例缩放成特定像素。如何在JavaScript中将上传的图片等比例缩放成特定像素?

1.canvas元素来缩放图片:

<!DOCTYPE html>
<html>
<head>
  <title>图片等比例缩放示例</title>
</head>
<body>
  <input type="file" id="uploadImage" accept="image/*">
  <canvas id="canvas"></canvas>
  <script>
    const inputElement = document.getElementById("uploadImage");
    const canvas = document.getElementById("canvas");
    const ctx = canvas.getContext("2d");
    inputElement.addEventListener("change", handleFileUpload);
    function handleFileUpload(event) {
      const file = event.target.files[0];
      const img = new Image();
      img.onload = function() {
        // 计算缩放后的宽度和高度
        const width = 200; // 目标宽度,这里设置为200像素
        const height = img.height * (width / img.width);
        // 设置canvas的宽度和高度
        canvas.width = width;
        canvas.height = height;
        // 在canvas上绘制等比例缩放后的图片
        ctx.drawImage(img, 0, 0, width, height);
        // 将缩放后的图片转换为DataURL
        const dataURL = canvas.toDataURL("image/jpeg");
        // 显示缩放后的图片
        const imageElement = document.createElement("img");
        imageElement.src = dataURL;
        document.body.appendChild(imageElement);
      };
      // 读取上传的图片文件并设置img的src属性
      const reader = new FileReader();
      reader.onload = function(e) {
        img.src = e.target.result;
      };
      reader.readAsDataURL(file);
    }
  </script>
</body>
</html>

2.JavaScript原生方法:

<!DOCTYPE html>
<html>

<head>
    <title>图片预览</title>
    <style>
        #preview {
            width: 200px;
            height: 200px;
            border: 1px solid #ccc;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        #preview img {
            max-width: 100%;
            max-height: 100%;
            object-fit: contain;
        }
    </style>
</head>

<body>
    <h1>图片上传预览</h1>
    <input type="file" id="upload" accept="image/*">
    <div id="preview"></div>
    <script>
        window.addEventListener('DOMContentLoaded', function () {
            var uploadInput = document.getElementById('upload');
            var preview = document.getElementById('preview');
            uploadInput.addEventListener('change', function (event) {
                var file = event.target.files[0];
                var reader = new FileReader();
                reader.onload = function (e) {
                    var imgUrl = e.target.result;
                    var img = document.createElement('img');
                    img.onload = function () {
                        var ratio = img.width / img.height;
                        var width, height;

                        if (ratio > 1) {
                            width = 200;
                            height = 200 / ratio;
                        } else {
                            width = 200 * ratio;
                            height = 200;
                        }
                        img.style.width = width + 'px';
                        img.style.height = height + 'px';
                        console.log(img)
                        preview.innerHTML = '';
                        preview.appendChild(img);
                    };
                    img.src = imgUrl;
                };
                reader.readAsDataURL(file);
            });
        });

    </script>
</body>

</html>

如果是为了大图片文件的像素修改特定像素上传到服务器,用以下方法:

<input type="file" id="upload" accept="image/*">
<canvas id="preview" style="display:none;"></canvas>

<script>

// JavaScript部分
document.getElementById('upload').addEventListener('change', function(event) {

  var file = event.target.files[0];
  var reader = new FileReader();
  
  reader.onload = function(event) {
    var img = new Image();
    
    img.onload = function() {
      var canvas = document.getElementById('preview');
      var ctx = canvas.getContext('2d');
      var maxWidth = 300;
      var maxHeight = 100;
      
      var width = img.width;
      var height = img.height;
      
      // 计算缩放比例
      var scale = Math.min(maxWidth / width, maxHeight / height);
      
      // 根据比例计算新的宽度和高度
      var newWidth = width * scale;
      var newHeight = height * scale;
      
      // 设置canvas尺寸
      canvas.width = newWidth;
      canvas.height = newHeight;
      
      // 绘制图片到canvas
      ctx.drawImage(img, 0, 0, newWidth, newHeight);
      
      // 获取缩放后的图片数据
      var resizedImageDataURL = canvas.toDataURL('image/jpeg');
      
      // 在此处添加上传代码,将resizedImageDataURL上传到服务器
  
      // 在此处添加预览代码,将resizedImageDataURL显示在页面上
      
      var previewImg = document.createElement('img');
      previewImg.src = resizedImageDataURL;
      document.body.appendChild(previewImg);
    };
    img.src = event.target.result;
  };
  reader.readAsDataURL(file);
});
</script>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个示例代码,使用canvas将图片压缩为指定大小,然后将压缩后的base64字符串上传到服务器。 HTML代码: ```html <input type="file" id="file-input"> ``` JavaScript代码: ```javascript // 获取文件输入框元素 const fileInput = document.getElementById('file-input'); // 监听文件输入框变化事件 fileInput.addEventListener('change', () => { // 获取文件对象 const file = fileInput.files[0]; // 创建 FileReader 对象 const reader = new FileReader(); // 读取文件完成事件 reader.addEventListener('load', () => { // 创建图像对象 const img = new Image(); // 图像加载完成事件 img.addEventListener('load', () => { // 创建 canvas 对象 const canvas = document.createElement('canvas'); // 缩放比例 const scale = Math.min(800 / img.width, 800 / img.height); // 设置 canvas 大小 canvas.width = img.width * scale; canvas.height = img.height * scale; // 绘制图像到 canvas 中 const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 将 canvas 转为 base64 字符串 const base64 = canvas.toDataURL('image/jpeg', 0.8); // 发送 base64 字符串到服务器 uploadBase64(base64); }); // 加载图像 img.src = reader.result; }); // 读取文件 reader.readAsDataURL(file); }); // 上传 base64 字符串到服务器 function uploadBase64(base64) { // 发送 AJAX 请求 // ... } ``` 这里使用 canvas 将图片压缩为指定大小,然后将压缩后的 base64 字符串上传到服务器。在实际开发中,还需要根据具体需求进行调整,比如调整压缩比例设置图片格式、设置上传方式等等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值