【发布时间】:2012-05-13 22:31:30
【问题描述】:
我有一个场景,我正在使用 Web 服务获取图像,并且所有图像的分辨率都不同。现在我的要求是我想要每个图像的分辨率并使用它来定义 UIImageView 的大小,这样我就可以防止我的图像变得模糊
例如,如果图像分辨率为 326 像素/英寸,则图像视图应该是该图像的大小可以完全表示而没有任何模糊。
【问题讨论】:
标签: iphone ipad uiimageview uiimage
我有一个场景,我正在使用 Web 服务获取图像,并且所有图像的分辨率都不同。现在我的要求是我想要每个图像的分辨率并使用它来定义 UIImageView 的大小,这样我就可以防止我的图像变得模糊
例如,如果图像分辨率为 326 像素/英寸,则图像视图应该是该图像的大小可以完全表示而没有任何模糊。
【问题讨论】:
标签: iphone ipad uiimageview uiimage
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 宽度/高度缩小两倍(这样每个 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])];
}
}
希望对您有所帮助!
【讨论】:
您可以使用以下代码获取图像大小。所以,首先计算下载的图像大小,然后根据它制作图像视图。
UIImage *Yourimage = [UIImage imageNamed:@"image.png"];
CGFloat width = Yourimage.size.width;
CGFloat height = Yourimage.size.height;
希望对你有所帮助..
【讨论】:
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% 工作......
【讨论】:
要解决这个问题,我们需要照顾device's display resolution.。
比如你有一张resolution的图片326ppi,和iPhone4、iPhone4S和iPod 4th Gen一样。所以你可以简单地使用@建议的解决方案尼特和@Peko。但对于其他设备(或这些设备上具有不同分辨率的图像),您需要将数学应用于calculate size 以获得更好的显示效果。
现在假设您有 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 中设置图像并调整它的大小时,它不会从图像中删除或添加像素,
【讨论】:
让 UIImageView 使用 contentMode 属性为您调整图像大小。
您可能希望以静态大小(“frame”属性)显示您的 UIImageView,该大小表示您要显示的图像的最大尺寸,并允许图像在该框架内相对于它们自己的特定尺寸调整大小要求(整体尺寸、纵横比等)。通过掌握 contentMode 属性,您可以让 UIImageView 为您处理不同大小的图像。它有许多不同的设置,其中之一是 UIViewContentModeScaleAspectFit,它会根据需要缩小图像以适应 UIImageView,如果图像更小,它将简单地居中显示。您可以使用设置来获得您想要的结果。
请注意,使用这种方法,您无需执行任何特殊操作来处理与 Retina 显示器相关的缩放问题。
【讨论】:
根据您在问题正文中所述的要求,我相信您无需更改 UIImageView 大小。
使用这行代码,图像可以完全表示,没有任何模糊:
imageView.contentMode = UIViewContentModeScaleAspectFit;
【讨论】: