我只是寫像你要求一些代碼,這裏是我做過什麼:
- 加載本地圖像通過FileReader和聽衆在
onload
監聽器添加到它的onload
事件
- ,創建一個「圖像」,由
new Image()
對象,並設置‘src’屬性由所加載的圖像‘SRC’(數據URL格式)
- 創建一個‘畫布’元件,並得出這樣的帆布
- 使用上的圖像獲取轉換後的圖像數據(以base64)
- 後的圖像數據到服務器
你以後繪製圖像的畫布,調用Canvas.toDataURL()
將獲得畫布內容Data URL字符串,請注意,它是畫布數據不是原始圖像數據,例如,如果圖像大小爲100 x 100並且畫布大小爲50 x 50,則使用此功能將獲得50 x 50像素的圖像,因此如果您想要全尺寸圖像,需要將畫布調整到一定的大小。
這個函數有兩個參數:
canvas.toDataURL(類型,encoderOptions);
- type - 指示圖像格式的DOMString。默認的格式類型是image/png。在您的代碼中,在您的案例中設置爲「image/jpeg」
- encoderOptions - 0到1之間的數字,指示圖像質量,如果請求的類型是image/jpeg或image/webp。
這是我的「預覽和上傳」功能寫在TypesScript供參考:
preview(input: HTMLInputElement) {
if (input.files.length) {
let reader = new FileReader();
reader.onload = (e) => {
if (!this.img) {
this.img = new Image();
}
this.img.src = (e.target as any).result;
this.img.onload =() => {
// omit code of setting 'dx', 'dy', 'width', 'height'
let ctx = <CanvasRenderingContext2D>this.canvas.nativeElement.getContext('2d');
ctx.drawImage(this.img, dx, dy, width, height);
let dataUrl = (<HTMLCanvasElement>this.canvas.nativeElement).toDataURL('image/jpeg', 0.7);
this.uploadService.upload(dataUrl).then((resp: any) => {
if (resp.key) {
this.asset.image = resp.key;
}
});
};
}
reader.readAsDataURL(input.files[0]);
}
}
我省略了一些變量:在上面的代碼dx, dx, width, height
,我用這些變量來調整圖像位置(剪輯目的)。
這是JavaScript的例子:
function _elm(id) {
return document.getElementById(id);
}
_elm('fileInput').onchange= function(event) {
if (event.target.files.length) {
var fileReader = new FileReader();
fileReader.onload = function(event) {
var img = new Image();
img.src = event.target.result;
_elm('sizeRaw').innerText = '+ data-url size ' + event.target.result.length;
img.onload = function() {
var canvas = _elm('canvas');
var context = canvas.getContext('2d');
context.drawImage(img, 0, 0, 200, 200);
var dataUrl = canvas.toDataURL('image/jpeg', 0.5);
_elm('output').innerText = dataUrl;
_elm('sizeNew').innerText = '+ data-url size ' + dataUrl.length;
}
};
fileReader.readAsDataURL(event.target.files[0]);
}
};
#canvas {
border: 1px solid blue;
}
#output {
word-break: break-all;
}
<h3>Input file <span id="sizeRaw"></span>: </h3>
<input id="fileInput" type="file" accept="image/*">
<h3>Canvas</h3>
<div>
<canvas id="canvas" width="200" height="200"></canvas>
</div>
<h3>Output <span id="sizeNew"></span>: </h3>
<div id="output">
</div>
35 KB仍然是非常小的。但我從來沒有見過任何人或任何相機使用PNG照片。您只能安全地接受JPEG圖像,而且沒有人會感到惱火。 –
@JBNizet我仍然希望我的用戶能夠將他們可能從網上找到的圖片上傳爲其他文件擴展名。如果它真的很罕見,我可以重新考慮,但我認爲PNG是一種非常常見的格式。 –
這是像頭像圖標這樣的圖標的常用格式。但不適合照片。並且使用JPG格式編碼PNG圖標將無濟於事,因爲PNG是這種圖像的更好格式。 –