Iphone 视网膜显示和[UIImage initWithData]

Iphone 视网膜显示和[UIImage initWithData],iphone,cocoa-touch,uiimage,Iphone,Cocoa Touch,Uiimage,我需要根据从服务器下载的原始数据初始化图像,该服务器根据iPhone客户端的类型提供正确大小的图像 我知道我应该在640x960显示器上将刻度值设置为2.0,但是这是一个只读属性,在使用initWithData时,无法在初始化期间设置 有什么想法吗?好的,您不需要自己设置刻度值。操作系统将为您处理点到像素的转换。我不知道您可以在图像数据本身中嵌入任何东西来告诉手机它是@2x图像,但类似的东西应该可以工作: UIImage * img = ...; img = [UIImage imageWith

我需要根据从服务器下载的原始数据初始化图像,该服务器根据iPhone客户端的类型提供正确大小的图像

我知道我应该在640x960显示器上将刻度值设置为2.0,但是这是一个只读属性,在使用initWithData时,无法在初始化期间设置


有什么想法吗?

好的,您不需要自己设置刻度值。操作系统将为您处理点到像素的转换。

我不知道您可以在图像数据本身中嵌入任何东西来告诉手机它是@2x图像,但类似的东西应该可以工作:

UIImage * img = ...;
img = [UIImage imageWithCGImage:img.CGImage scale:2 orientation:img.imageOrientation];

由于iOS 6.0
UIImage
具有方法
+imageWithData:scale:
,因此可以将
2.0
作为视网膜的比例传递。

如果需要,可以将
[[UIScreen main screen]scale]
作为比例参数传递,而不是
2.0f
将其放入.m或导入的类中(调用函数IMAO时,c的语法更好)

然后,使用服务器数据创建映像时:

[UIImage imageWithData:dataFromServer scale:isRetina()?2:1];
迅捷3,4版

let image = UIImage(data: imageData, scale: UIScreen.main.scale)

如果我只是根据数据初始化UIImage,它在iPhone4上会放大。(例如,在iPhone4上,320x480图像将全屏显示)。我需要以某种方式防止出现这种情况,以便我可以使用高分辨率图像。只有当图像具有@2x后缀时,才可以使用@2x后缀,这在您
initWithData
时是不可能的。这也为我修复了它,谢谢!我在图像上绘制了文本,需要它来保持结果图像上的正确比例。对我来说也是如此……但为什么我们必须执行此操作如果我们用UIImagePNGrepresentation存储一个图像并希望它正确返回,那么就不会有这样低级的东西??这不像苹果。CGDataProviderRef dataProvider=CGDataProviderCreateWithCFData((CFDataRef));CGImageRef cgHeaderImage=CGImageCreateWithPNGDataProvider(dataProvider,NULL,NO,kCgRenderingEndDefault);CGDataProviderRelease(数据提供程序);headerCell.headerImage.image=[UIImage imageWithCGImage:cgHeaderImage scale:2.0 orientation:UIImageOrientationUp];CGImageRelease(cgHeaderImage);因为PNGRepression没有“缩放”的概念(类似地,JPEG表示也没有透明度的概念);图像只是由CGImage加载。虽然理论上你可以使用图像DPI,但我很确定CGImage只是忽略DPI信息,因此UIImage必须进行额外的解析。此外,DPI信息几乎总是毫无意义:Mac默认为72,Windows默认为96,大多数数码相机默认为300(以及“DPI”)一张照片的分辨率是完全没有意义的;我想要角度分辨率/FOV和镜头畸变曲线)。我也只需要使用
UIImage*img=[UIImage-imageWithData:…];img=[UIImage-imageWithCGImage:img.CGImage,scale:2-orientation:img.imageOrientation];
。最后,
img=[UIImage-imageWithData:UIImagePNGRepresentation(img)]
不是身份转换;UIImagePNGRepression通常必须从预乘alpha转换为“正常”alpha.你知道这有多慢吗?只需使用
UIImage*image=,,;
。大多数苹果创建的UI元素都可以处理过大的图像,它们会自动缩小。我可以建议将问题标题改为“如何更改UIImage的缩放属性”吗为了让它更容易找到?哇,我在4年前问过这个问题。我想我会留下它,谢谢。为什么不直接打电话给
[UIImage imageWithData:dataFromServer scale:[UIScreen main screen].scale]
?这将对iPhone 6+造成影响。
let image = UIImage(data: imageData, scale: UIScreen.main.scale)