RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/アプリ開発
アプリ開発/2026-06-23中級

壁紙アプリの色がくすむ問題と Display P3 — 広色域を配信パイプラインで詰める

同じ壁紙が実機ではくすんで見える。原因は広色域(Display P3)とsRGBの取り違えでした。6本の壁紙アプリで色域を詰めた実装手順に加え、画素が本当に広色域かを見分ける方法、配信前ゲートのスクリプト、Android広色域までまとめます。

iOS108壁紙アプリ28Display P3色域expo-image5Rork515

プレミアム記事

ある朝、自分の壁紙アプリでプレビューした画像と、実際に設定した後のロック画面の色が、どうも違って見えました。プレビューでは深い青だった空が、設定後は少し灰色がかってくすんで見えるのです。最初はディスプレイの明るさの問題かと思ったのですが、明るさを揃えても差は消えませんでした。

原因は広色域、いわゆる Display P3 と sRGB の取り違えでした。2019年に吉祥寺駅の上空で光の輪を見て以来、私は色や光の見え方にずいぶん敏感になったのですが、まさか自分の配信パイプラインで色が痩せているとは気づいていませんでした。この記事は、6本の壁紙アプリを個人開発で運用しながら色域を一つずつ詰めてきたときの手順と、確認に使ったコマンドの記録です。単に「プロファイルを埋める」だけでなく、画素が本当に広色域かを見分ける段階、配信前に取りこぼしを止めるゲート、そして Android 側の事情まで含めて整理します。

なぜ実機で色がくすんで見えたのか

iPhone は iPhone 7 の頃から Display P3 という広色域ディスプレイを積んでいます。sRGB より一回り広い範囲の色を表示できるので、鮮やかな赤や緑が素直に出ます。問題は、画像にカラープロファイル(ICCプロファイル)が埋め込まれていないときに起こります。

iOS はプロファイルのない画像を「これは sRGB だろう」とみなして表示します。ところが私が配信していた一部の壁紙は、書き出しのときにプロファイルが剥がれた状態で、しかも中身は P3 の色域で塗られていました。P3 の数値を sRGB の物差しで読むと、彩度が低い方へずれます。これが「くすむ」の正体でした。逆にプロファイルが正しく埋まっていれば、iOS が自動で色域を合わせてくれるので、P3 非対応の古い端末でも破綻しません。

ここで大事な区別が一つあります。色には「画素の数値」と「その数値をどの物差しで読むかというプロファイル」の二つがあり、どちらかが欠けると意図した色になりません。くすみは、画素は P3 なのにプロファイルが無いせいで sRGB の物差しで読まれた、という食い違いから生まれていました。

まず色域を確認する

推測で直すと泥沼にはまります。最初にやったのは、配信中の画像が実際にどの色域を持っているかを機械的に確認することでした。macOS の sips で埋め込みプロファイルを読めます。

# 単体ファイルのカラープロファイルを確認する
sips --getProperty profile wallpaper_001.jpg
 
# 配信フォルダ全体をざっと棚卸しする
for f in ./assets/*.jpg; do
  echo "$f"
  sips --getProperty profile "$f" 2>/dev/null | grep -i "profile:" || echo "  (プロファイルなし)"
done

6アプリ合わせておよそ2,000枚を棚卸ししたところ、3割近くがプロファイルなし、あるいは sRGB タグのまま中身が P3 という状態でした。書き出しツールの設定が「カラープロファイルを埋め込まない」になっていたのが直接の原因です。ここを直すだけで、くすみの大半は消えました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
配信画像のカラープロファイルを sips で棚卸しし、Display P3 で統一して埋め直す具体手順
プロファイルの有無だけでなく、画素が本当に広色域を使っているかを ImageMagick で判定し、誤った P3 付与を防ぐ方法
配信前に『プロファイルなし』をゼロにする色域ゲートのシェルスクリプトと、Android 広色域・App Store スクリーンショットの落とし穴
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-05-31
iOSアプリから壁紙を『設定』まで導く現実的な設計 — Save to Photos の権限と Shortcuts 連携
iOSでは壁紙をアプリから直接設定できません。add-only 権限での保存、Live Photo の扱い、設定アプリへの誘導、Shortcuts オートメーションまで、6本の壁紙アプリで詰めてきた実装と計測値をまとめます。
アプリ開発2026-07-14
壁紙を長押しして、プレビューと保存メニューを出す — Rork の Expo アプリで context menu を組む
壁紙ギャラリーのカードを長押ししても何も起きない。iOS利用者はプレビュー付きのメニューを期待します。Pressableだけでは届かない理由から、zeegoでのネイティブcontext menu実装、スクロールとの競合解消、保存・共有アクション、Android向けの自前フォールバックまで、動くコードでまとめます。
アプリ開発2026-06-29
クリップボード連携のUXを整える — iOSのペースト許可バナーを増やさずに「コピー」と「貼り付け」を成立させる
expo-clipboard で「コピー」と「貼り付け」を実装するとき、iOS のペースト許可バナーが頻発して使い勝手を損なうことがあります。バナーの発生条件を押さえ、hasStringAsync で内容を読まずにボタンを出し分ける設計をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →