2
1

More than 1 year has passed since last update.

CSSやJSで画像リサイズ

Last updated at Posted at 2022-02-15

フロント側で画像リサイズ方法を紹介します、取得した画像が大きすぎるため小さくして表示したい、送信したい場面に役立つかと思います。

画像をリサイズして表示する

表示するだけであれば、わざわざ容量を落とす必要もないためCSSで調整可能です。
新たなCSSプロパティであるobject-fitでのリサイズがオススメです。

デモ

See the Pen Untitled by miyakezaka (@miyakezaka) on CodePen.

object-fit: cover;でアスペクト比を維持したまま横幅と高さを自動で調節してくれます。

CSS

img {
  object-fit: cover;
  width: 100px;  //任意の数値
  height: 100px; //任意の数値
}

値によってリサイズの種類を設定できます。
MDN object-fit
https://developer.mozilla.org/ja/docs/Web/CSS/object-fit

IE対応

IEに対応する場合はポリフィルを読み込む必要があります。

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/object-fit-images/3.2.4/ofi.min.js"></script>
<script>
 objectFitImages();
</script>

CSS

img {
    object-fit: cover;
    font-family: 'object-fit: cover;'; /*IE対策*/
}

画像本体をリサイズして送信する

送信する際は、見栄えだけではなく本体の容量を落とすケースが考えられます。
Canvasを使用してbase64形式でリサイズが可能です。

デモ

https://secret-black-moji-5876.ssl-lolipop.jp/article/image-resize/
ディベロッパーツールで画像を確認すると画像がリサイズされているのがわかるかと思います。
※デモの画像だと元画像の大きさと大差がないので、base64のため容量は上がっています。

JS

window.addEventListener('load', function(){
  const elemiImg = document.getElementById("img");
  // canvas要素を生成
  const cvs1 = document.createElement('canvas');
  const ctx1 = cvs1.getContext('2d');
  cvs1.width = elemiImg.width;
  cvs1.height = elemiImg.height;
  ctx1.drawImage(elemiImg, 0, 0);
  // Base64を作成
  const base64_1 = cvs1.toDataURL("image/png");

  // 最大幅、最大高さを設定
  const maxWidth = 200, 
        maxHeight = 200;
  // Imageのインスタンス生成
  const img1 = new Image();
  // Imageインスタンスにbase64格納
  img1.src = base64_1;
  // img1.srcを読み込まれてから安全に実行
  img1.onload = function() {
    // 読み込み画像のアスペクト比調整
    let width, height;
    if(img1.width > img1.height){
      const ratio = img1.height/img1.width;
      width = maxWidth;
      height = maxWidth * ratio;
    } else {
      const ratio = img1.width/img1.height;
      width = maxHeight * ratio;
      height = maxHeight;
    };
    // canvasタグを生成
    const cvs2 = document.createElement('canvas');
    cvs2.width  = width;
    cvs2.height = height;

    // コンテキスト(canvasの描画に必要なもの、2Dグラフィックを描画するためのメソッド)を取得
    const ctx2 = cvs2.getContext('2d');

    // canvasに計算したアスペクト比で画像を描画する
    ctx2.drawImage(img1,
      0, 0, img1.width, img1.height,
      0, 0, width, height
    );
    // Canvasでリサイズしたbase64を取得
    const base64_2 = cvs2.toDataURL(img1);

    // 挿入用の画像を生成 〜 出力
    const img2 = new Image();
    img2.src = base64_2;
    const elemAfter = document.getElementById('after');
    elemAfter.appendChild(img2);
  };
});

送信する際はFileAPIで読み込むケースが多いかと思いますが、また別の機会に載せたいと思います。

最後までご覧戴き、ありがとうございました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1