我对iOS中的视网膜与非视网膜图像有一些疑问。实际上我正在下载一些图像文件,它们没有附加@ 2x后缀。我几乎没有问题。
1 - 首先,它在下载后不在文档库中,所以@ 2x不能像捆绑的视网膜图像一样工作。我的假设是否正确?
2 - 视网膜的大小是非视网膜图像的两倍,但如果你看到视网膜图像的缩放比例为2.0,那么如果我手动将任何图像缩放到2.0,那么会有任何质量差异吗?例如我有一个图像Image1.png并将其转换为scale 2.0并且只是在UIImageView中添加,而在另一边我有相同的图像,但名称为Image2@2x.png,我在UIImageView中添加了Image2。与Image2相比,Image1中的质量差异是什么?
如果图像是非视网膜的话,这是我用来将其转换为2.0或视网膜的代码片段。
UIImage *image = [UIImage imageNamed:@"fileName"];
UIImage *convertedImage = [UIImage imageWithData:UIImagePNGRepresentation(image) scale:2.];
答案 0 :(得分:0)
下载的图像放在文档库中。您无法使用[UIImage imageNamed:@"filename"]
获取图像,因为这些功能仅从包中获取图像。这里是如何从文档库中获取图像的示例:
NSString *bundlePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
UIImage *image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", bundlePath, fileName]];
缩放非视网膜图像以获得视网膜大小是不好的做法。我的建议是,您下载的图像应该是视网膜大小。从中,生成非视网膜图像并将其保存在文档库中。
这是如何缩放视网膜图像并将其保存在文档库中的示例。要获得非视网膜大小,您可以手动缩放然后保存它。这里是示例代码:
UIImage *image = [UIImage imageNamed:@"yourRetinaImage@2x.png"];
// set non-retina size from current image
CGSize size = CGSizeMake(image.size.width / 2., image.size.height / 2.);
/** scale the image */
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0.0, size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, size.width, size.height), image.CGImage);
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/** save scaled image */
NSString *basePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
// save with same name but without suffix "@2x"
NSString *filePath = [NSString stringWithFormat:@"%@/%@", basePath, @"nonRetinaImage"];
@try {
[UIImagePNGRepresentation(scaledImage) writeToFile:filePath options:NSAtomicWrite error:nil];
} @catch (NSException *exception) {
NSLog(@"error while saving non-retina image with exception %@", exception);
}