2017-08-15 13 views
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) 
    } 
    }) 
} 

答えて

1

型のソース画像より従って、典型的には大きいロスレスフォーマットであり、デフォルトでPNGファイルを生成する画像種別方法toBlob() with no mime-type argument JPEG。

変更この行:

canvas.toBlob(function (b) { 
    console.log(readableSize(b.size)) 
}) 

それはJPEGだけでなく、品質設定を使用して作った画像のMIMEの引数を取る:品質の引数([0.0、1.0]と

canvas.toBlob(function(b) { 
    console.log(readableSize(b.size)) 
}, "image/jpeg", 0.7); 

実験)あなたのニーズに合わせて。

+0

はい、そうです。しかし、私は "excrescent"データが何でどこから来たのか疑問に思います。 – maicss

+0

PNGはJPEGとは異なる圧縮方式を使用しているため、そのままの状態ですべてのデータが保存されるため、サイズが大きくなります。キャンバスは元のイメージとタイプを追跡しません。キャンバスに存在するものだけが元のイメージと出力イメージの間に相関がありません。修正するには、回答を参照してください(品質パラメータを含むソース画像としてJPEGを使用してください)。 – K3N

+0

別の言い方をすると、元の画像ではなく新しい画像がキャンバスのビットマップから生成されます。デフォルトはPNGなので、画像は大きくなります(通常はとにかく)。元の画像を一致させるには、同じ圧縮方式を使用します。 pngの代わりにjpeg、 – K3N

関連する問題