web-dev-qa-db-ja.com

iPhoneのjpg画像と2x画像

私はiphoneアプリに取り組んでおり、iOS 4.0以降をターゲットにしています。 UIImageViewに画像を追加しようとしていますが、画像はjpeg形式です。これは私がこれまでにしたことです。

UIImageView *bgImageView            =   [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 246.0)];
bgImageView.image                   =   [UIImage imageNamed:@"background"];
[self.view addSubview:bgImageView];
[bgImageView release];

2つの画像を追加しました。

  1. background.jpg(通常の1x画像として)
  2. [email protected](2x/Retinaディスプレイ用)。

しかし、ビルドして実行すると、バックグラウンドがないことを除いて、すべてが正常に実行されます。他のすべてのウィジェットはありますが、背景が白く、画像が表示されていません。

次に、背景用に2つのpng画像を作成し、プロジェクトに追加して実行しました。今回は私の経歴を示しました。 documentation jpg画像はUIImageを搭載したiPhoneで使用できるため、私は困惑しました。

Jpg画像で再試行し、上記のコードをこれに変更しました

UIImageView *bgImageView            =   [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 246.0)];
bgImageView.image                   =   [UIImage imageNamed:@"background.jpg"]; //added extension
[self.view addSubview:bgImageView];
[bgImageView release];

上記のコードを実行すると、背景画像が表示されますが、2x画像が読み込まれません。それは私のjpg画像が素晴らしいことを示しています、そしてそれは犯人ではありません。そのため、拡張子を付けずに画像名を付けると、pngファイル(1xと2xの両方)がそれぞれのデバイスに読み込まれ、jpgファイルはまったく読み込まれません。バグのようです(SDKまたはドキュメントのいずれか)。 iOS4は良い年になりました。なぜ誰もそれに気づかなかったのですか?また、すべての画像をpngに変換する以外に、オプションはありますか?

編集:

さて、質問の2日後、答えはゼロです。私はすでにすべての画像をpngに変換しました、そして私のプロジェクトのその部分は完了しました(私のプロジェクトは待つことができなかったので..)。それでも、私自身のために、そして将来これに直面するすべての人のために、私はこの問題についてもっと知りたいと思います。少なくとも誰かがこれが確かにAppleバグであることを確認できます。私はより多くの人々がこのスレッドを見ることができるように報奨金を始めています。

もう一度編集

この賞金が終了するまであと2日です。回答してくださった皆様、ありがとうございました。しかし、一つはっきりさせておきます。私はすでにすべての画像をpngに変換したと言って、先に進みました。 imageNamedがjpgファイルとpngファイルを同じように扱うことを確認したかっただけです。ドキュメントは確かにそうするだろうと言っています(AppleがUIImageドキュメント以外の場所に書いている場合を除く))ドキュメントが正しい場合、2つの考えられる理由で私のコードが失敗しました

  1. これはimageNamedのバグです。これが理由である場合は、バグレポートを提出するか、画像をpngに変更するか、ラッパーを作成して(Chandanが回答で述べたように)、先に進む以外に選択肢はあまりありません。
  2. 使用したjpeg画像に問題があります。まあ、私はフォトショップの男ではありません。しかし、私はRGBAjpg画像を使用しました。画像が重要な場合は、デザイナーの友人に聞いて詳細情報を提供する準備ができています。

もう一つ。 This 投稿もこの問題について説明しています。しかし、彼は背後にある理由を知りません。だから私は一人ではありません。

編集:終わり

さて、それは画像自体に関連するものです。私はグーグルでいくつかのサンプルjpeg画像をダウンロードして、それで遊んだ。それらのいくつかは正しく表示され、いくつかは表示されません。バウンディタイムが過ぎたので、バグを再現しようとしてjpg画像を拡張せずに正常にロードしたPengOneにバウンディを与え、より多くの画像を処理できるようにします。助けようとしたすべての人に感謝します。

22
Krishnabhadra

UIImageクラスリファレンスによると:

ディスカッション

このメソッドは、指定された名前の画像オブジェクトをシステムキャッシュで検索し、存在する場合はそのオブジェクトを返します。一致する画像オブジェクトがまだキャッシュにない場合、このメソッドは指定されたファイルから画像データをロードしてキャッシュし、結果のオブジェクトを返します。

IOS 4以降を実行しているデバイスでは、デバイスの画面のスケールが1.0の場合、動作は同じです。画面のスケールが2.0の場合、このメソッドは最初に、@ 2xサフィックスが追加された同じファイル名の画像ファイルを検索します。たとえば、ファイルの名前がbuttonの場合、最初にbutton @ 2xを検索します。 2xが見つかった場合は、その画像を読み込み、返されたUIImageオブジェクトのscaleプロパティを2.0に設定します。それ以外の場合は、変更されていないファイル名をロードし、scaleプロパティを1.0に設定します。さまざまな倍率の画像をサポートする方法の詳細については、iOSアプリケーションプログラミングガイドを参照してください。特殊

考慮事項

IOS 4以降では、ファイル名拡張子を指定するためにファイルの名前は必要ありません。 iOS 4より前は、ファイル名拡張子を指定する必要があります。

IOS 4.0以降を対象としているため、ファイル名拡張子が必要ですnot。この潜在的なバグを再現しようとしましたが、ファイル名拡張子がなくても期待どおりに機能しました。

アプリでこの効果を作成するために何がうまくいかなかったのかについて、いくつかのアイデアを次に示します。

  1. ある時点で画像を変更した場合、問題はキャッシュに起因する可能性があります。

  2. ファイル名拡張子を使用しないことを選択し、オプションとして「background.jpg」と「background.png」の両方がある場合、「。png」ファイルを使用するように設定されているように見えます。

  3. アプリを最初に実行した後でターゲットをiOS4.0以降に設定した場合、ファイル名拡張子が必要になり、画像が空白でキャッシュされた可能性があります。これにより、理論1に戻ります。

それは私がこれで作ることができる最高です。

11
PengOne

次のような画像を取得するラッパーを作成します

-(UIImage*) getImage:(NSString*)imageName{

    UIImage *image;

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) {

        // RETINA DISPLAY
        NSString *jpegFile = [imageName stringByAppendingString:@"@2x.jpg"];
        image = [UIImage imageNamed:jpegFile];
    }
    else{

        NSString *jpegFile = [imageName stringByAppendingString:@".jpg"];
        image = [UIImage imageNamed:jpegFile];
    }

    return image;
}

そしてあなたのコード呼び出しから

bgImageView.image                   =   getImage(@"background");
7

Xcode 6の夜明けとともに、JPG画像が特定のiOS7デバイスでまったくレンダリングされない可能性があることがわかりました(一部のデバイスでは機能するが他のデバイスでは機能しない場合があります。また、別のデバイスでは異なる結果が表示される場合があります)開発者のマシン、一貫性がないようです)。これは、画像がXIBのUIImageViewで参照されているだけなのか、プログラムで[UIImage imageNamed:](nilを返す)を使用して参照されているのかに関係ありません。

長い間頭を悩ませた後、解決策は* .jpgファイル拡張子を* .pngに変更することでした(ファイルの内容は明らかにJPGデータのままにしておきます)。

HTH

5
Oliver Pearmain

画像のフルネームを入力するだけです。

bgImageView.image = [UIImage imageNamed:@"background.jpg"]; 

拡張機能を省略しないでください。

@ 2xについては、コード内のどこかで呼び出す必要はありません。正しくコーディングすれば、ここで提案されているように、Retinaディスプレイをテストする必要はありません。

1
Dancreek