Webサービスを使用して画像を取得し、すべての画像の解像度が異なるシナリオがあります。今、私の要件は、各画像の解像度が必要であり、それを使用してUIImageViewのサイズを定義し、画像がぼやけないようにすることです。
たとえば、326ピクセル/インチの場合の画像の解像度は、その画像のサイズがぼやけることなく完全に表現できるサイズである必要があります。
Webサービスを使用して画像を取得し、すべての画像の解像度が異なるシナリオがあります。今、私の要件は、各画像の解像度が必要であり、それを使用してUIImageViewのサイズを定義し、画像がぼやけないようにすることです。
たとえば、326ピクセル/インチの場合の画像の解像度は、その画像のサイズがぼやけることなく完全に表現できるサイズである必要があります。
UIImage *img = [UIImage imageNamed:@"foo.png"];
CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height);
UIImageView *imgView = [[UIImageView alloc] initWithFrame:rect];
[imgView setImage:img];
画像サイズは解像度です。
あなたの問題は-網膜ディスプレイかもしれません!
Retinaディスプレイを確認し、UIImageViewの幅/高さを2倍小さくします(各UIImageViewピクセルがRetinaディスプレイ用の4つの小さいUIImageピクセルで構成されるようにします)。
Retinaディスプレイを確認する方法:
https://stackoverflow.com/a/7607087/894671
画像サイズを確認する方法(実際に画像をメモリにロードせずに):
NSString *mFullPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]
stringByAppendingPathComponent:@"imageName.png"];
NSURL *imageFileURL = [NSURL fileURLWithPath:mFullPath];
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)imageFileURL, NULL);
if (imageSource == NULL)
{
// Error loading image ...
}
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache, nil];
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (CFDictionaryRef)options);
NSNumber *mImgWidth;
NSNumber *mImgHeight;
if (imageProperties)
{
//loaded image width
mImgWidth = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
//loaded image height
mImgHeight = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
CFRelease(imageProperties);
}
if (imageSource != NULL)
{
CFRelease(imageSource);
}
だから-例えば:
UIImageView *mImgView = [[UIImageView alloc] init];
[mImgView setImage:[UIImage imageNamed:@"imageName.png"]];
[[self view] addSubview:mImgView];
if ([UIScreen instancesRespondToSelector:@selector(scale)])
{
CGFloat scale = [[UIScreen mainScreen] scale];
if (scale > 1.0)
{
//iphone retina screen
[mImgView setFrame:CGRectMake(0,0,[mImgWidth intValue]/2,[mImgHeight intValue]/2)];
}
else
{
//iphone screen
[mImgView setFrame:CGRectMake(0,0,[mImgWidth intValue],[mImgHeight intValue])];
}
}
お役に立てば幸いです。
UIImage *oldimage = [UIImage imageWithContentsOfFile:imagePath]; // or you can set from url with NSURL
CGSize imgSize = [oldimage size];
imgview.frame = CGRectMake(10, 10, imgSize.width,imgSize.height);
[imgview setImage:oldimage];
100%動作しています...。
次のコードを使用して画像サイズを取得できます。したがって、最初にダウンロードした画像サイズを計算し、それに従って画像ビューを作成します。
UIImage *Yourimage = [UIImage imageNamed:@"image.png"];
CGFloat width = Yourimage.size.width;
CGFloat height = Yourimage.size.height;
うまくいけば、これはあなたを助けるでしょう..
コンテンツモードプロパティを利用してUIImageViewに作業を任せ、画像のサイズ変更を行います。
表示する画像の最大サイズを表す静的なサイズ設定(「フレーム」プロパティ)を使用してUIImageViewを表示し、特定のサイズ要件(全体として)に対してそのフレーム内で画像のサイズを変更できるようにする必要があります。サイズ、アスペクト比など)。contentModeプロパティをマスターすることで、UIImageViewにさまざまなサイズの画像を処理するための手間のかかる作業を任せることができます。さまざまな設定があります。そのうちの1つはUIViewContentModeScaleAspectFitで、UIImageView内に収まるように必要に応じて画像を縮小します。画像が小さい場合は、中央に表示されます。あなたはあなたが望む結果を得るために設定で遊ぶことができます。
このアプローチでは、Retinaディスプレイに関連するスケーリングの問題に対処するために特別なことは何もする必要がないことに注意してください。
この問題を解決するには、デバイスのディスプレイ解像度に注意を払う必要があります。。
たとえば、iPhone4、iPhone4S、iPod 4th Genと同じ解像度 326ppiの画像があるため、@Nitと@Pekoが提案するソリューションを簡単に使用できます。ただし、他のデバイス(またはこれらのデバイスの解像度が異なる画像)の場合は、表示を改善するためにサイズを計算するために数学を適用する必要があります。
ここで、 260ppi(サイズW x H)の画像があり、それをiPhone4Sに表示したいとします。これは、1インチあたりに含まれる情報が、iPhoneの表示解像度よりも小さいため、画像サイズを小さくしてサイズを変更する必要があるためです。 326/260倍。したがって、使用するimageViewのサイズは次のようになります。
imageViewWidth = W*(260/326);
imageViewHeight = H*(260/326);
一般に:
resizeFactor = imageResolution/deviceDisplayResolution;
imageViewWidth = W*resizeFactor;
imageViewHeight = H*resizeFactor;
ここでは、imageViewで画像を設定してサイズを変更するときに、画像からピクセルを削除または追加しないことを検討しています。
質問の本文で述べた要件に従って、UIImageViewのサイズを変更する必要はないと思います。
次のコード行を使用すると、画像をぼやけることなく完全に表現できます。
imageView.contentMode = UIViewContentModeScaleAspectFit;