網站圖片優化

  • 2019 年 11 月 6 日
  • 筆記
  • 影像壓縮
  • JPEG/JPG
  • PNG (PNG-8 與 PNG-24)
  • WebP

影像壓縮

1.使用 imagemin cd進入項目根目錄

npm install imagemin

2.創建一個名為 imagemin.js 的新文件,寫入以下內容:

const imagemin = require('imagemin');  const PNGImages = 'static/images/*.png';  const JPEGImages = 'static/images/*.jpg';  const output = 'build/images';

3.運行 node imagemin.js

JPEG/JPG

優點

  • 有損壓縮。高品質的壓縮方式:當我們把圖片體積壓縮至原有體積的 50% 以下時,JPG 仍然可以保持住 60% 的品質
  • 以 24 位存儲單個圖,可以呈現多達 1600 萬種顏色,足以應對大多數場景下對色彩的要求,壓縮前後的品質損耗不易察覺

使用場景

適用於呈現色彩豐富的圖片

  • 大的背景圖
  • 輪播圖
  • Banner圖

缺陷

  • 處理矢量圖形和 Logo 等線條感較強、顏色對比強烈的影像時,人為壓縮導致的圖片模糊會相當明顯
  • 不支援透明度處理,透明圖片需要召喚 PNG 來呈現

用 MozJPEG 壓縮 jpeg 1.npm install imagemin-mozjpeg 2.以下內容添加到 imagemin.js 中

const imageminMozjpeg = require('imagemin-mozjpeg');  const optimiseJPEGImages = () =>    imagemin([JPEGImages], output, {      plugins: [        imageminMozjpeg({          quality: 70,        }),      ]    });  optimiseJPEGImages()    .catch(error => console.log(error));

3.運行 node imagemin.js, 從build/images 文件夾中獲取優化後的版本

PNG (PNG-8 與 PNG-24)

優點

  • 無損壓縮高保真
  • 8 位的 PNG 最多支援 256 種顏色,24 位的可以呈現約 1600 萬種顏色
  • 比 JPG 更強的色彩表現力,對線條的處理更加細膩,對透明度有良好的支援

缺點

  • 體積太大

應用場景

  • 呈現小的 Logo、顏色簡單且對比強烈的圖片或背景等

使用 pngquant 優化 PNG 影像 1.npm install imagemin-pngquant 2.以下內容添加到 imagemin.js 中

const imageminPngquant = require('imagemin-pngquant');  const optimisePNGImages = () =>    imagemin([PNGImages], output, {      plugins: [        imageminPngquant({ quality: '65-80' })      ],    });  optimiseJPEGImages()    .then(() => optimisePNGImages())    .catch(error => console.log(error));
將 quality 設置為 65-80 可以在文件大小和影像品質之間較好的折衷方案

WebP

優點

像 JPEG 一樣對細節豐富的圖片信手拈來,像 PNG 一樣支援透明,像 GIF 一樣可以顯示動態圖片——它集多種圖片文件格式的優點於一身

官方介紹

與 PNG 相比,WebP 無損影像的尺寸縮小了 26%。在等效的 SSIM 品質指數下,WebP 有損影像比同類 JPEG 影像小25-34%。 無損 WebP 支援透明度(也稱為 alpha 通道),僅需 22% 的額外位元組。對於有損 RGB 壓縮可接受的情況,有損 WebP 也支援透明度,與 PNG 相比,通常提供 3 倍的文件大小。

  • 通過以無損和有損格式編碼影像來提供更小的文件大小,使其成為 JPEG 和 PNG 的一個很好的替代方案
  • 清晰度通常可以與 JPEG 和 PNG相提並論,而且文件大小要小得多
  • 瀏覽器對 WebP 支援並不普遍

優化webp影像 1.npm install imagemin-webp 2.以下內容添加到 imagemin.js 中

const imageminWebp = require('imagemin-webp');  const convertPNGToWebp = () =>    imagemin([PNGImages], output, {      use: [        imageminWebp({          quality: 85,        }),      ]    });  const convertJPGToWebp = () =>    imagemin([JPGImages], output, {      use: [        imageminWebp({          quality: 75,        }),      ]    });  optimiseJPEGImages()    .then(() => optimisePNGImages())    .then(() => convertPNGToWebp())    .then(() => convertJPGToWebp())    .catch(error => console.log(error));

quality 設置為 85 會生成品質與 PNG 相當但小得多的 WebP 影像。