Blurhashとmduiを使用した動的テーマカラーとぼかしプレビューの実装
このブログ記事では、Blurhashとmduiフレームワークを組み合わせて使用し、ウェブページの動的テーマカラーと画像のぼかしプレビュー効果を実装する方法を紹介しています。Blurhashはぼかし効果を生成するためのライブラリで、mduiはMaterial Designに基づいたフロントエンドフレームワークです。著者はまず目標を紹介し、背景画像の主要な色調を利用してページのテーマカラーを設定し、画像を前処理してBlurhashを生成することでページ読み込みパフォーマンスを最適化します。次に、画像のBlurhashを一括生成してJSONファイルに保存するためのPythonスクリプトを提供しています。その後、JavaScriptコードを通じてBlurhashをbase64形式の画像に変換し、そこからテーマカラーを抽出します。最後に、著者は実装の効果を示し、関連プロジェクトのGitHubリンクを提供しています。
この記事の最終更新は 1 年 9 か月 前です
特定のライブラリ(Blurhash、mdui)やデザインシステム(Material Design 3)の実装方法に依存しているため、将来のバージョンアップによってコードや手順が古くなる可能性があります。
現代のWeb開発において、ユーザー体験の向上はしばしば細部の最適化を伴います。Blurhashは、ぼかしハッシュの生成とデコードに使用されるライブラリで、画像のぼかしプレビュー効果を実現できます。一方、mduiは、Material Design 3(Material You)に基づいたフロントエンドフレームワークを提供し、豊富なコンポーネントとスタイルを含んでいます。このブログ記事では、Blurhashとmduiを組み合わせて、背景画像に基づいて動的にテーマカラーを設定するページを実装し、画像読み込みパフォーマンスを最適化します。
目標H2#
ページの下部に背景画像を配置し、その背景画像の主要な色調をページ全体のテーマカラーとして使用したいと考えています。
画像を前処理してBlurhashを生成し、ランダム画像apiを通じて直接提供H2#
ページ読み込み時の計算オーバーヘッドを避けるため、各画像のBlurhashを事前に生成し、JSONファイルに保存できます。
以下のPythonスクリプトは、画像を一括処理してBlurhashを生成できます:
import concurrent.futures
import os
import json
import logging
from PIL import Image
from blurhash import encode
logging.basicConfig(level=logging.INFO)
current_path = os.path.abspath(os.path.dirname(__file__))
def encode_file(file):
logging.info(f'Encoding {file} to blurhash')
image = Image.open(os.path.join(current_path, file))
blurhash = encode(image, x_components=4, y_components=3)
return file, blurhash
current_files = [f for f in os.listdir(current_path) if f.endswith(('jpg', 'png', 'jpeg'))]
blurhashes = {}
with concurrent.futures.ThreadPoolExecutor() as executor:
future_to_file = {executor.submit(encode_file, file): file for file in current_files}
for future in concurrent.futures.as_completed(future_to_file):
file = future_to_file[future]
try:
file, blurhash = future.result()
blurhashes[file] = blurhash
except Exception as exc:
logging.error('%r generated an exception: %s' % (file, exc))
with open('blurhash.json', 'w') as f:
json.dump(blurhashes, f)これにより、バックエンドはこのjsonファイルを読み取って画像に対応するblurhash値を取得し、画像と一緒に提供できます
提供されるデータは以下のようになります
{
"code": "200",
"image": "https://cdn.tnxg.top/images/wallpaper/5.jpg",
"blurhash": "LcI~*}r=TJS$~VX8S2b^?HW;wIoe"
}背景画像とテーマカラーの設定H2#
この時点で、画像のurlと対応するぼかしハッシュを既に持っています。
この時、ぼかしハッシュをbase64形式の画像に変換できます
const blurredImage = (blurhash) => {
if (!blurhash) return '';
const pixels = decode(blurhash, 32, 32);
const canvas = document.createElement('canvas');
canvas.width = 32;
canvas.height = 32;
const ctx = canvas.getContext('2d');
const imageData = ctx.createImageData(32, 32);
imageData.data.set(pixels);
ctx.putImageData(imageData, 0, 0);
return canvas.toDataURL();
};そして、base64画像から新しいimageオブジェクトを作成し、そのテーマカラーを取得できます
元の画像のぼかしハッシュから変換された画像なので、主要な色調はそれほど変わらないはずです。したがって、この色を直接テーマカラーとして使用できます
const blurredImageData = blurredImage(data.blurhash);
const ColorImage = new Image();
ColorImage.src = blurredImageData;
getColorFromImage(ColorImage)
.then(color => {
setColorScheme(color);
console.log('Color scheme set.' + color);
})生成されたbase64ぼかし画像は、カードの背景としても使用でき、背景とカードの色調を一致させて調和を保つことができます
Blurhashの受け渡しについては、状態管理Piniaを使用して変換後のbase64画像をグローバル状態に直接保存できます。これにより、毎回再計算する必要がなくなります
最終効果H2#
以上の手順により、ページ読み込み時にまずぼかしプレビュー画像を表示し、その主要な色調に基づいて動的にテーマカラーを設定することを実現しました。高解像度の背景画像の読み込みが完了したら、ぼかしプレビュー画像を置き換え、ユーザー体験とページパフォーマンスを向上させました。
以下は最終効果の例です:

このブログ記事が、Blurhashとmduiを使用してWebアプリケーションのユーザー体験を向上させる方法をより良く理解し、活用するのに役立つことを願っています。ご質問やご提案がありましたら、コメント欄にお気軽にお書きください。
Beautiful website