web-dev-qa-db-ja.com

blobを画像ファイルに変換

入力type = file要素からキャプチャした画像ファイルを変換しようとしていますが、成功しません。以下は私のJavaScriptコードです

        var img = document.getElementById('myimage');
        var file = document.querySelector('input[type=file]').files[0];
        var reader = new FileReader();
        reader.addEventListener("load", function () {
            var theBlob = reader.result;
            theBlob.lastModifiedDate = new Date();
            theBlob.name = file;
            img.src = theBlob;
            var newfile = new File([theBlob], "c:files/myfile.jpg");

        }, false);

        if (file) {
            reader.readAsDataURL(file);
        }

画像はimg要素に正しく表示されますが、[ファイル]コマンドではmyfile.jpg画像ファイルは作成されません。サーバーにアップロードする前に、画像をキャプチャし、JavaScriptを使用してサイズを変更しようとしています。画像ファイルが作成されない理由を誰かが知っていますか?さらに良いことに、クライアントで画像ファイルのサイズを変更してサーバーにアップロードする方法についてのコードを誰かが持っていますか?

2
Dave

これは、Canvasを使用して「myimage」要素からサイズ変更されたjpegファイルを取得する方法です。

コードのすべての行にコメントを付けたので、私が何をしているのか理解していただけます。

// Set the Width and Height you want your resized image to be
var width = 1920; 
var height = 1080; 


var canvas = document.createElement('canvas');  // Dynamically Create a Canvas Element
canvas.id = "extractFileCanvas";  // Give the canvas an id
canvas.width  = width;  // Set the width of the Canvas
canvas.height = height;  // Set the height of the Canvas
var ctx=canvas.getContext("2d");  // Get the "CTX" of the canvas 
var img=document.getElementById("myimage");  // The id of your image container
ctx.drawImage(img,0,0,width,height);  // Draw your image to the canvas


var jpegFile = c.toDataURL("image/jpeg"); // This will save your image as a 
                                               //jpeg file in the base64 format.

JavaScript変数「jpegFile」に、URL:// Base64形式にエンコードされた画像が含まれるようになりました。これは次のようになります。

// data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...9oADAMBAAIRAxEAPwD/AD/6AP/Z"

その変数を画像ソースにして画像を表示するか、Base64エンコードされた文字列をサーバーにアップロードすることができます。

編集:ファイルをblobに変換してサーバーにアップロードする方法

// This function is used to convert base64 encoding to mime type (blob)
function base64ToBlob(base64, mime) 
{
    mime = mime || '';
    var sliceSize = 1024;
    var byteChars = window.atob(base64);
    var byteArrays = [];

    for (var offset = 0, len = byteChars.length; offset < len; offset += sliceSize) {
        var slice = byteChars.slice(offset, offset + sliceSize);

        var byteNumbers = new Array(slice.length);
        for (var i = 0; i < slice.length; i++) {
            byteNumbers[i] = slice.charCodeAt(i);
        }

        var byteArray = new Uint8Array(byteNumbers);

        byteArrays.Push(byteArray);
    }

    return new Blob(byteArrays, {type: mime});
}

次に、base64をクリーンアップしてから、上記の関数に渡します。

var jpegFile64 = jpegFile.replace(/^data:image\/(png|jpeg);base64,/, "");
var jpegBlob = base64ToBlob(jpegFile64, 'image/jpeg');  

Ajaxで「jpegBlob」を送信します

var oReq = new XMLHttpRequest();
oReq.open("POST", url, true);
oReq.onload = function (oEvent) {
  // Uploaded.
};

oReq.send(jpegBlob);
7
YAHsaves

ブラウザから直接ハードドライブを操作することはできません。ただし、ダウンロードできるリンクを作成することができます。

これを行うには、var newfile = new File([theBlob], "c:files/myfile.jpg");を次のように変更します。

const a = document.createElement('a');
a.setAttribute('download', "some image name");
a.setAttribute('href', theBlob);

a.click();
3
user3210641