【问题标题】:Resize image before sending to BASE64 (without using img element)在发送到 BASE64 之前调整图像大小(不使用 img 元素)
【发布时间】:2015-06-17 21:03:07
【问题描述】:

编辑:我不想在客户端显示图像,目的是缩小图像和缩放...

我在调整图像大小时遇到​​了一些问题,该图像是在必须上传到服务器之前使用表单中的文件输入选择的。

我有以下代码监控我的文件输入:

// monitor file inputs and trigger event
$(document).on('change', '.btn-file :file', function() {

    var F = this.files;
    if(!isImage( F[0] ))
    {
        alert("Not an image file"); 
    }

    var fileurl = resizeImage(F[0]);
    console.log(fileurl);               

    var input = $(this),label = input.val().replace(/\\/g, '/').replace(/.*\//, '');
    input.trigger('fileselect', [label]);
});

此函数将调用 resizeImage,如下所示:

function resizeImage(file)
{
    var MAX_WIDTH = 800;
    var MAX_HEIGHT = 600;

    var img = document.createElement("img");
    img.src = window.URL.createObjectURL(file);
    console.log(img.width);         

    var canvas = document.createElement('canvas');

    var width = img.width;
    var height = img.height;

    if (width > height) {
      if (width > MAX_WIDTH) {
        height *= MAX_WIDTH / width;
        width = MAX_WIDTH;
      }
    } else {
      if (height > MAX_HEIGHT) {
        width *= MAX_HEIGHT / height;
        height = MAX_HEIGHT;
      }
    }
    canvas.width = width;
    canvas.height = height;

    var ctx = canvas.getContext("2d");

    ctx.drawImage(img, 0, 0, width, height);
    console.log(ctx);       
    var dataurl = canvas.toDataURL("image/png");
    return dataurl;
}

问题是,我的控制台日志告诉我,我的 resize 函数的返回值是“data:”。然后我开始使用控制台记录我的方法,以缩小问题所在。在我的 resizeImage 函数中,我记录了我的 img 元素的宽度,它给了我 0 的宽度,这不应该是正确的吗? ..我不知道我做错了什么..

【问题讨论】:

  • 你为什么要用 JS 而不是 CSS?
  • @COOOL 如何使用 css 缩小/调整图像大小? ..
  • 使用background-imagebackground-size: coverbackground-size: contain(取决于你的需要)?
  • 使用 PHP 服务器端。 PHP 可以很容易地做到这一点。 Javascript 不能。
  • @DTH,如果您在画布上绘制的 img 与网页不在同一个域中,则 toDataURL 将返回一个空 url。禁止跨域是出于安全考虑。

标签: javascript php base64


【解决方案1】:

如果您的目标浏览器支持file 输入属性,那么您可以使用URL.createObjectURL 创建可以使用canvas 元素操作的图像源。

给定最大期望大小maxW x maxH,您可以计算缩放因子,在保持原始纵横比不变的情况下调整图像大小,如下所示:

var scale=Math.min((maxW/img.width),(maxH/img.height));

这是示例代码和演示。

请注意,该演示确实将图像绘制到画布上,但您可以轻松地将内存中的画布替换为 document.createElement('canvas')

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;

// limit the image to 150x100 maximum size
var maxW=150;
var maxH=100;

var input = document.getElementById('input');
input.addEventListener('change', handleFiles);

function handleFiles(e) {
  var img = new Image;
  img.onload = function() {
    var iw=img.width;
    var ih=img.height;
    var scale=Math.min((maxW/iw),(maxH/ih));
    var iwScaled=iw*scale;
    var ihScaled=ih*scale;
    canvas.width=iwScaled;
    canvas.height=ihScaled;
    ctx.drawImage(img,0,0,iwScaled,ihScaled);
    alert(canvas.toDataURL());
  }
  img.src = URL.createObjectURL(e.target.files[0]);
}
body{ background-color: ivory; }
#canvas{border:1px solid red;}
<input type="file" id="input"/>
<br>
<canvas id="canvas" width=300 height=300></canvas>

【讨论】:

  • 感谢 MarkE,这正是我想要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
相关资源
最近更新 更多