1
私は前面にユーザーがアップロードする画像を圧縮します。キャンバスがイメージサイズを拡大するのはなぜですか?
ソースイメージは651Kb(Mac OS)で、サイズフォーム(1920 * 1080)を(1000 * 562)に変更すると、画像のサイズは1.2Mb(ブラウザ)、1.4Mb(Mac OS)、1.29 Mb(Windows 7)。どんなものであれ、元のイメージのサイズを大きくしていました。
なぜですか?
ソース画像:http://7xoaqt.com1.z0.glb.clouddn.com/maikailun.jpg
コード:https://codepen.io/maicss/pen/ayLgdo/
<input type="file" multiple accept="image/*">
<canvas></canvas>
const $ = document.querySelector.bind(document)
const input = $('input')
const canvas = $('canvas')
const ctx = canvas.getContext('2d')
const readableSize = (size) => {
return size/1024 > 1024 ? (~~(10 * size/1024/1024))/10 + 'MB' : ~~(size/1024) + 'KB'
}
input.onchange = function (e) {
const files = e.target.files;
[].forEach.call(files, file => {
const img = new Image()
img.src = URL.createObjectURL(file)
img.onload = function() {
let radio = 1
if (Math.min(this.height, this.width) > 1000) {
radio = Math.max(this.height/1000, this.width/1000)
}
canvas.height = this.height/radio
canvas.width = this.width/radio
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
canvas.toBlob(function (b) {
console.log(readableSize(b.size))
})
URL.revokeObjectURL(this.src)
}
})
}
はい、そうです。しかし、私は "excrescent"データが何でどこから来たのか疑問に思います。 – maicss
PNGはJPEGとは異なる圧縮方式を使用しているため、そのままの状態ですべてのデータが保存されるため、サイズが大きくなります。キャンバスは元のイメージとタイプを追跡しません。キャンバスに存在するものだけが元のイメージと出力イメージの間に相関がありません。修正するには、回答を参照してください(品質パラメータを含むソース画像としてJPEGを使用してください)。 – K3N
別の言い方をすると、元の画像ではなく新しい画像がキャンバスのビットマップから生成されます。デフォルトはPNGなので、画像は大きくなります(通常はとにかく)。元の画像を一致させるには、同じ圧縮方式を使用します。 pngの代わりにjpeg、 – K3N