我有一个场景,我正在使用 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];
图像大小是它的分辨率。
您的问题可能是 - 视网膜显示!
检查视网膜显示,因此 - 使 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% 工作....
要解决这个问题,我们需要注意设备的显示分辨率。.
例如,您有一个分辨率为 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 中设置图像并调整它的大小时,它不会从图像中删除或添加像素,
让 UIImageView 通过使用 contentMode 属性为您调整图像大小来完成工作。
您可能希望使用静态大小(“frame”属性)来显示您的 UIImageView,该大小表示您要显示的图像的最大尺寸,并允许图像在该框架内根据它们自己的特定尺寸要求调整大小(总体大小、纵横比等)。通过掌握contentMode属性,您可以让 UIImageView 为您处理不同大小的图像做繁重的工作。它有许多不同的设置,其中之一是 UIViewContentModeScaleAspectFit,它会根据需要缩小图像以适应 UIImageView,如果图像更小,它将简单地居中显示。您可以使用设置来获得您想要的结果。
请注意,使用这种方法,您不需要做任何特殊的事情来处理与 Retina 显示器相关的缩放问题。
根据您在问题正文中所述的要求,我相信您无需更改 UIImageView 大小。
使用这行代码,图像可以完全表示而没有任何模糊:
imageView.contentMode = UIViewContentModeScaleAspectFit;