猫の手ツール

Coordinate Logic & Canvas Optimization

座標スケーリングとピクセル抽出の最適化手法

ブラウザ上で「画像から色を抜く」というシンプルな操作。その裏側では、表示上の座標を実際の巨大なピクセルデータに変換する高精度なマッピングと、モバイル端末のメモリ制約をクリアするための工夫が凝らされています。

1. 解像度に依存しない動的座標マッピング

このツールの核心は、ユーザーが画面上で「タップした場所」を、Canvas内の「実際のピクセル座標」に変換するアルゴリズムです。ブラウザ上の表示サイズ(CSSピクセル)はデバイスによって様々ですが、抽出元となる画像データは4Kを超えることもあります。

メリット: 表示上のサイズ(BoundingClientRect)と、Canvas自体の解像度(Width/Height)の比率を動的に算出することで、どのデバイスでも「タップした場所の色」を1ピクセルの狂いもなく取得できます。

// 表示上の座標から、実ピクセル座標への変換ロジック
const rect = canvas.getBoundingClientRect();

// 独自の計算ロジック:表示上の位置と実解像度の比率を算出
const scaleX = canvas.width / rect.width;
const scaleY = canvas.height / rect.height;

// タップ位置(clientX, clientY)をCanvas内の座標(x, y)へマッピング
const x = Math.floor((clientX - rect.left) * scaleX);
const y = Math.floor((clientY - rect.top) * scaleY);

// 抽出対象の1ピクセルデータを取得
const pixel = ctx.getImageData(x, y, 1, 1).data;

2. willReadFrequently によるピクセル解析の高速化

このツールでは、Canvasのレンダリングコンテキストを取得する際に willReadFrequently: true というオプションを有効にしています。これは、比較的新しいブラウザで導入されたパフォーマンス最適化のためのフラグです。

メリット: 頻繁に getImageData を呼び出す場合、ブラウザはデータをCPUに近いメモリ領域で管理するように最適化を行います。これにより、特にスマホで画像をなぞりながら連続して色を抽出する際のレスポンスが劇的に向上します。

// 頻繁なデータ読み取りを想定したコンテキストの初期化
// willReadFrequentlyフラグにより、読み取りパフォーマンスを最大化
const ctx = canvas.getContext('2d', { 
    willReadFrequently: true 
});

3. モバイル環境を保護する「解像度ガードレール」設計

最新スマホの写真は5000pxを超えることもありますが、そのままCanvasに乗せるとモバイルブラウザはメモリ不足でクラッシュします。本ツールでは、読み込み時にアスペクト比を維持したまま、処理に最適な上限解像度へスケーリングするガードレールを設けています。

メリット: SNSシェア用の高画質な色見本作成には十分な解像度を維持しつつ、端末のクラッシュを防ぎ、なおかつ HEIC 形式の自動変換パイプラインも備えることで、iPhoneユーザーにもシームレスな体験を提供しています。

// 巨大画像に対するメモリ保護とスケーリング
const MAX_DIMENSION = // 独自の解像度上限値;

if (img.width > MAX_DIMENSION || img.height > MAX_DIMENSION) {
    const scale = MAX_DIMENSION / Math.max(img.width, img.height);
    const targetW = Math.floor(img.width * scale);
    const targetH = Math.floor(img.height * scale);
    
    // オフスクリーンCanvasで安全なサイズへ「焼き付け」
    // 以降、このリサイズ済みの軽量データを解析に使用
    // ここに座標変換とCanvas再描画の処理が入ります
}

Developer's Note

このスポイトツールを開発する上で最もこだわったのは、「触感(レスポンス)」です。特にスマホでは、指でなぞった時に色がスルスルと変わっていく心地よさが重要です。

そのために、タッチイベントの passive: false 設定でスクロールとの干渉を防ぎつつ、Canvasのコンテキストオプションを最適化しました。また、当サイトの基本理念である「外部サーバーへ一切データを送らない」というポリシーを守るため、HEIC変換すらもライブラリを動的に読み込んで端末内で行うように設計しています。

あなたの手元にある大切な写真を、一瞬たりともネットの海に放り出すことなく、安心して色選びを楽しんでいただければ幸いです。