输入捕获文件减少和转换问题

Posted

技术标签:

【中文标题】输入捕获文件减少和转换问题【英文标题】:input capture file reduce and convert issue 【发布时间】:2021-10-03 23:47:53 【问题描述】:

我尝试从相机(Samsung Tab s7)捕获 html5 输入,然后调整大小(我的主要目标是减小图像大小),然后通过我的控制器上传发布方法。但是当我上传时,我的文件识别出 .bin 并像这样保存。我无法保存 jpeg。我该如何解决?

HTML

 <input type="file" id="captureImageInput" style="display:none;" accept="image/*" capture>

JS:

const fileInput = document.getElementById('captureImageInput');
 fileInput.addEventListener('change', e => 
    if (e.target.files.length == 0) 
            // No file captured, ignore
            return;
        
    else
        var imageFile = e.target.files[0];
        //--resize image START

        var canvas = document.createElement("canvas");
        var img1 = document.createElement("img");
        img1.setAttribute('src', imageFile); 
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img1, 0, 0);

        var MAX_WIDTH = 800;
        var MAX_HEIGHT = 600;
        var width = img1.width;
        var height = img1.height;

        if (width > height) 
            if (width > MAX_WIDTH) 
                height *= MAX_WIDTH / width;
                width = MAX_WIDTH;
            
        
        else if (width == 0 && height == 0)
        
            width = MAX_WIDTH;
            height = MAX_HEIGHT;
         
        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(img1, 0, 0, width, height);

        var dataurl = canvas.toDataURL("image/jpeg");

        var blobBin = atob(dataurl.split(',')[1]);
        var array = [];
        for (var i = 0; i < blobBin.length; i++) 
            array.push(blobBin.charCodeAt(i));
        
        var resizedFileBlob = new Blob([new Uint8Array(array)],  type: 'image/jpeg' );
   
        //--resize image END
        
         var fullFileName = serialNo + "-" + stockNo;

         var fileImage = new File([resizedFileBlob], fullFileName);

         var myFormData = new FormData();
         myFormData.append('FormFile', fileImage);

          $.ajax(
          //POST OPERATION TO CONTROLLER
          );

     

  );

控制器端:

 [HttpPost]
 public JsonResult SavePhysicalPath(FileModel myFormData) 
  
   //update physical path operatıons..
 

文件模型类:

 public class FileModel
    
        public string FileFolderPath  get; set; 
        public string Files  get; set; 
        public IFormFile[] FormFile  get; set; 
    

【问题讨论】:

【参考方案1】:

根据您的代码,我认为问题与您使用此行 var fileImage = new File([resizedFileBlob], fullFileName); 创建了一个新文件有关。

我建议你可以去掉这行,直接使用resizedFileBlob 作为参数传递给后端。

我已经创建了一个如下的测试演示,你可以参考一下。

Js:

<script type="text/javascript">

    $(document).ready(function () 
        var canvas = document.getElementById("canvas");
        var ctx = canvas.getContext("2d");
        var img = new Image();

        img.onload = function () 

            // set size proportional to image
            canvas.height = canvas.width * (img.height / img.width);

            // step 1 - resize to 50%
            var oc = document.createElement('canvas'),
                octx = oc.getContext('2d');

            oc.width = img.width * 0.5;
            oc.height = img.height * 0.5;
            octx.drawImage(img, 0, 0, oc.width, oc.height);

            // step 2
            octx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5);

            // step 3, resize to final size
            ctx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5,
                0, 0, canvas.width, canvas.height);




        
        img.src = "https://i.imgur.com/SHo6Fub.jpg";

        var cav = document.getElementById("canvas");
        const file = dataURLtoBlob(cav.toDataURL());
        var fileImage = new File([file], "test");
        const fd = new FormData;

        fd.append('image', fileImage);

        $.ajax(
            type: 'POST',
            url: '/api/Foo',
            data: fd,
            processData: false,
            contentType: false
        );

    );


    function dataURLtoBlob(dataURL) 
        let array, binary, i, len;
        binary = atob(dataURL.split(',')[1]);
        array = [];
        i = 0;
        len = binary.length;
        while (i < len) 
            array.push(binary.charCodeAt(i));
            i++;
        
        return new Blob([new Uint8Array(array)], 
            type: 'image/png'
        );
    ;

</script>

查看:

<img src="https://i.imgur.com/SHo6Fub.jpg"  >
<canvas id="canvas" width=300></canvas>

结果:

【讨论】:

以上是关于输入捕获文件减少和转换问题的主要内容,如果未能解决你的问题,请参考以下文章

android减少摄像头捕获图像的文件大小小于500 kb

影子寄存器,输入捕获和输出比较。

具有捕获和接受属性的 HTML 文件输入控件工作错误?

具有捕获和接受属性的 HTML 文件输入控件工作错误?

Krajee Bootstrap 文件输入,捕获 AJAX 成功响应

将屏幕截图捕获为图像然后使用 ffmpeg 将图像转换为视频文件的时间应该是啥?