RustとWebAssemblyにおける画像サイズの上限にぶ... ノート

RustとWebAssemblyにおける画像サイズの上限にぶつかる

多くの画像ツールは品質スライダーを提供していますが、政府の義務により特定のファイルサイズ制限が求められることが多く、これは別の問題です。品質とファイルサイズの間の関係は複雑で、さまざまな画像プロパティやエンコーダー設定に依存します。このプロジェクトは、出力ファイルサイズがターゲットバイト制限以下であるという不変条件を持つHEICコンバーターを作成することを目的としていました。ブラウザベースの実装は、効率のためにWebAssemblyにコンパイルされたRustを使用しています。重要な設計上の選択は、画像を一度だけデコードし、バウンドされた画像オブジェクトを保持して、プレビュー、回転、変換のための冗長でコストのかかるデコード操作を回避することでした。システムは「正確なサイズ」を上限として定義しており、ファイルはターゲットサイズ以下であり、正確に特定のバイト数ではないことを意味します。これにより、ターゲットを内部的にバイトに変換してすべての比較を行うことで、ユーザーインターフェイスにおけるKB測定の曖昧さを回避します。JPEG変換の場合、アルゴリズムは保護された範囲内で最適な品質設定を見つけるために二分探索を採用しています。この探索は、まず最小品質でエンコードし、大きすぎる場合はリサイズして再検索することで最適化されます。初期のJPEGエンコードが大きすぎる場合、システムは画像面積に基づいて新しいスケールを推定し、リサイズする前に小さなマージンを適用して高品質フィルターを使用します。PNG変換はロスレスであるため、品質ノブはありません。代わりに、寸法が調整されます。これには、大きな写真の初期ダウンサイジング、エンコードと比較、そしてバイト予算をより多く利用するための「グローバック」フェーズが含まれる場合があります。JPEGまたはロスレスPNGへの変換は、異なるバイトターゲットへの圧縮とは別に保持され、明確なユーザーの意図を保証します。色情報、特にICCプロファイルは、可能な限り変換および圧縮中に保持されます。WebAssembly契約はシンプルになるように設計されており、画像バイトとともに明示的なメタデータを返し、UIコードを圧縮ロジックから分離します。最後に、システムは実際のHEICファイルでテストされ、不変条件(出力バイト数 <= ターゲットバイト数)、品質フロア、寸法、その他のメトリックが満たされていることを確認し、ページからのデータ漏洩を防ぎます。