.05 2011

UIImageとRetina(2)

Tasakiです。

新年明けましておめでとうございます。
今年も当ブログをよろしくお願いいたします。

さて、年をまたいでしまいましたが、前回の続きと参りましょう。

単精度画像を倍精度画像として使用する。ということでしたが、これは厳密に言うとできない 模様です。

どういうことかと言いますと、前回お話したUIImageのscaleプロパティなんですが、これはreadonlyに設定されており、参照は可能ですが変更することはできません。

じゃあどうするのかと言うと、ここでは少し発想を変えまして、一旦作成した単精度画像オブジェクトから倍精度画像を作成してしまうことにします。

例えば、UIImageに以下のようなメソッドを追加してみましょう。
このメソッドは、引数で渡された画像オブジェクトから、現在の画面解像度に応じたコンテキストを持つ画像オブジェクトを作成するものです。

+ ( id ) scaledImageWithImage:( UIImage* ) image {
 CGFloat scale = [[ UIScreen mainScreen ] scale ];
 CGSize size = image.size;
 if( round( image.scale ) != round( scale )) {
  CGSize newSize = CGSizeMake( size.width / scale, size.height / scale );
  UIGraphicsBeginImageContextWithOptions( newSize, YES, scale );
  [ image drawInRect: CGRectMake( 0.0, 0.0, newSize.width, newSize.height )];
  image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
 }
 return image;
}

上記コード中で肝になるのがこの関数です。

void UIGraphicsBeginImageContextWithOptions(
  CGSize size,
  BOOL opaque,
  CGFloat scale
);

これは、画像コンテキストを作成する関数の1つで、iOS4.0で追加されたものです。
最後の引数scaleに2.0を渡せばRetina用のコンテキストを作成してくれます。
こうして作成したコンテキストに対して画像を描画し、それを内包した画像オブジェクトを取得する、というわけです。

厳密にはこの書き方だと問題があったりする場合もあるようですが、ひとまずこれで画面解像度に応じた画像オブジェクトを扱うことが可能になります。

当然ですが、こうするとRetinaの場合は画像オブジェクトのsizeは小さくなりますので、ご注意を。

関連記事
スポンサーサイト



Comment

-
このコメントは管理人のみ閲覧できます
2011.01.07 21:42

Post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/164-807ba569

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク