6

我有一个场景,我正在使用 Web 服务获取图像,并且所有图像的分辨率都不同。现在我的要求是我想要每个图像的分辨率并使用它来定义 UIImageView 的大小,这样我就可以防止我的图像变得模糊

例如,如果图像分辨率为 326 像素/英寸,则图像视图应该是该图像的大小可以完全表示而没有任何模糊。

4

7 回答 7

4
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];
于 2012-05-04T11:30:09.017 回答
3

图像大小是它的分辨率。

您的问题可能是 - 视网膜显示!

检查视网膜显示,因此 - 使 UIImageView宽度/高度小两倍(这样每个 UIImageView 像素将由四个较小的 UIImage 像素组成,用于视网膜显示)。

如何检查视网膜显示:

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])];
    }
}

希望有帮助!

于 2012-05-13T17:11:31.867 回答
2

您可以使用以下代码获取图像大小。所以,首先计算下载的图像大小,然后根据它制作图像视图。

UIImage *Yourimage = [UIImage imageNamed:@"image.png"];
CGFloat width = Yourimage.size.width;
CGFloat height = Yourimage.size.height;

希望对你有帮助..

于 2012-05-04T11:27:52.887 回答
2
 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% 工作....

于 2012-05-17T11:28:24.540 回答
1

要解决这个问题,我们需要注意设备的显示分辨率。.

例如,您有一个分辨率为 326ppi的图像,与 iPhone4、iPhone4S 和 iPod 4th Gen 相同。所以您可以简单地使用@Nit 和@Peko 建议的解决方案。但是对于其他设备(或这些设备上具有不同分辨率的图像),您将需要应用数学来计算尺寸以获得更好的显示效果。

现在假设您有260ppi(尺寸为 W x H)的图像,并且您希望将其显示在 iPhone4S 上,因此其中每英寸包含的信息小于 iPhone 的显示分辨率,因此我们需要通过减小图像大小来调整它的大小326/260 系数。所以现在你将使用的 imageView 的大小是

imageViewWidth = W*(260/326);

imageViewHeight = H*(260/326);

一般来说:

resizeFactor = imageResolution/deviceDisplayResolution;
imageViewWidth = W*resizeFactor;
imageViewHeight = H*resizeFactor;

在这里,我正在考虑当我们在 imageView 中设置图像并调整它的大小时,它不会从图像中删除或添加像素,

于 2012-05-14T20:19:12.023 回答
1

让 UIImageView 通过使用 contentMode 属性为您调整图像大小来完成工作。

您可能希望使用静态大小(“frame”属性)来显示您的 UIImageView,该大小表示您要显示的图像的最大尺寸,并允许图像在该框架内根据它们自己的特定尺寸要求调整大小(总体大小、纵横比等)。通过掌握contentMode属性,您可以让 UIImageView 为您处理不同大小的图像做繁重的工作。它有许多不同的设置,其中之一是 UIViewContentModeScaleAspectFit,它会根据需要缩小图像以适应 UIImageView,如果图像更小,它将简单地居中显示。您可以使用设置来获得您想要的结果。

请注意,使用这种方法,您不需要做任何特殊的事情来处理与 Retina 显示器相关的缩放问题。

于 2012-05-14T00:41:07.940 回答
0

根据您在问题正文中所述的要求,我相信您无需更改 UIImageView 大小。

使用这行代码,图像可以完全表示而没有任何模糊:

imageView.contentMode = UIViewContentModeScaleAspectFit;
于 2012-05-17T06:00:36.687 回答