Tomo.Log()


iOS15のPNGの透過バグについて

[04/05, 2022]

English / 日本語

iOSのPNGの透過バグでハマってしまい、すごい時間を費やしてしまったのでメモ。

iOSには既知のバグがありますが、今回出会したのはそれとはちょっと違うみたいです。

既知のバグについて

iOS13:透過付きのPNGなどをアプリ内で読み込むと、透過がなくなってしまう現象があるみたいです。
iOS15.1:透過PNGの背景が白く塗りつぶされてしまうようです。

今回ぶつかったバグ

結論から言うと

1辺が360px以下のPNGは、iOS内で透過情報がなくなってしまう。

と言うものです。

iOS内でと書いたのはMacにAirdropしたりすると、一応透過情報は残っていて正常に透過されて表示されました。

そもそもなんでこんなバグにぶつかったかと言うと、CGContextをinitして作成してpngを書き出そうとしていたのですが、透過されず困ってしまったのがきっかけでした。

最初は、BitmapInfoの設定が間違っているのかとあれこれやと試しまくっていたのですが、ふと「UIGraphicsGetCurrentContext」で取得したcontextで書き出したらどうだろう?と試してみたら無事とうした画像を出力できました。

UIGraphicsGetCurrentContextと自力でinitしたcontextの違いはsizeの設定でした。sizeが違うと言っても、アスペクト比は同じで「UIGraphicsGetCurrentContext」をする前に「UIGraphicsBeginImageContextWithOptions」でcontextを開始するのですが、この時にscaleが暗黙的に2になりサイズが2倍違うことに気づきます。

そこで自力でinitしているcgcontextもサイズを2倍にしたら無事透過されました。

「2倍に何の秘密があるんだ〜!!」とすごい悩みましたがサイズをちょっとずつ変更して、力技で閾値の「360」までだどりつきました😂

360にどんな秘密があるのかはわかりませんが、361px以上あれば無事透過されます(謎!

いいブログネタができたと割り切って、また明日から頑張りたいと思います。