2012 年 4 月 22 日

Mobile Safariで大きなJPEG画像を表示すると画像が汚くなる

Mobile Safari

mobile safariで大きな画像を扱うとき、気をつけることが何点があったので、記録しておきます。

iphone4,ipad(3rd generation)は、retinaディスプレイ採用に伴って解像度が2倍になっていて、より鮮明な画像が扱えるようになっています。しかし、いままでの解像度の画像を、表示したらどうなるのか?大きさが半分(面積は1/4)になってしまうのか。

mobile safariでは、1pixelを倍にして表示するようになっています。画像の大きさは元の大きさですが、このままだとジャギーが目立った画像になってしまいます。

多くのブログで紹介されていますが、元の画像を倍の解像度におきかえて、imgタグでは従来の大きさで指定してやると、鮮明な画像が表示できます。

たとえば、正方512ピクセルの画像は、正方1024ピクセルの画像にしておいて、imgタグを以下のように書いておくと、きれいに表示できます

<img src="hoge.jpg" style="width:512px;height:512px" />

しかし、画像の大きさを2倍にすると、当然ファイルのサイズも大きくなり、保管するストレージ領域増加、データ転送速度低下という問題が発生します。

また、mobile safariでは扱えるリソースに制限があります。

Know iOS Resource Limits

たとえば、JPEGイメージでいうと、32Mピクセル以上の画像は1/16のサイズ(2M)に縮小されるとあります。2Mピクセルを超えたものは、サブサンプリング(色情報の削減を行うことでダウンサンプリングともいう)されるとあります。

単純に解像度が高くなったからと、2Mピクセルを超える大きな解像度の画像を用意すると、逆に画像が粗く汚くなるという現象が発生します。

つまり2Mピクセル(1414×1414ピクセル程度)というのがポイントですね。

大きな画像を扱うには、分割することも考えた方がよいでしょうね。

ipad(3rd G.)では2048×1536(3M)あるのに、2Mの壁って、釈然としませんが、これはmobile safariから閲覧したときで、写真アプリなど(対応アプリ)では、問題ありません。

※扱える最大ピクセルは画像フォーマット(GIF,PNG,JPEG)やデバイスのメモリサイズにより変わるようです。

データ転送の問題に関しては、apple.comでは通常解像度と高解像度の画像を用意しておいて、javascriptで高解像度の画像があるかどうかをまず調べてから(HEADを先に読む)、コンテンツをロードするような仕組みがあるようです。しかし、HTTPリクエストが増加するという問題はあります。

How Apple.com will serve retina images to new iPads

この記事をたどらせていただいたmyakura様のブログには、このような記事があります。

Responsive imagesのための-webkit-image-set()

javascriptにたよらなくても、cssで書けるようになるんでしょうかね。