2013-05-30 52 views
0

假设我想要图像为视网膜屏幕的320x100分,我将不得不制作640x200像素的图像并将其命名为@ 2x。问题是,我从640x200像素的Web服务下载图像。通常情况下,@ 2x图像会被转换为手机尺寸320x100点,但Web服务中的图像仍然是640x200点。来自网络服务的视网膜图像的iOS图像大小

注 - Web服务是我自己的,所以我可以修复它,如果它是Web服务的问题。

很抱歉,如果有可能的措辞没有问题很好,但是这就是我的意思(类似): Retina display and [UIImage initWithData]

+0

首先你应该建立一个通用的测量单位。不要使用点和像素,因为您会感到困惑,1点与2像素不相等。 – danypata

+0

使用scale = 2使用'+ [imageWithCGImage:scale:orientation:]' – Mar0ux

+0

@danypata然后我应该用什么来引用设备中的大小?我的理解是,对于视网膜设备1x1点== 2x2像素 – harinsa

回答

1

你必须手动设置点控制的高度和宽度,自动将以较高的DPI显示图像而不会不必要地缩小比例。

+0

或更确切地说:'UIImage * img = ...; img = [UIImage imageWithCGImage:img.CGImage scale:2 orientation:img.imageOrientation];'(对于其他人有同样的问题) – harinsa

+1

但所有设备没有2的比例。这就是为什么你必须将它设置为预期的高度和宽度,或者在运行时动态计算正确的比例。 – Monstieur

0

如果未通过imageNamed加载,@ 2x图像的尺寸始终是非视网膜图像尺寸的两倍。

创建的图像,像这样在视网膜上的和非视网膜设备:

UIImage *anImage = [UIImage imageNamed: @"anImageName"]; 
NSLog(@"%@: scale: %f", NSStringFromCGSize(anImage.size), anImage.scale); 

印刷视网膜设备上的CGSize对象将非视网膜图像的大小相同,但将有刻度设置为2.0。

使用明确的视网膜后缀创建图像将显示图像实际上是图像的两倍 - 因此imageNamed会自行缩放图像。

对于想要在已经创建和尺寸的图像视图中显示的情况,您仍然不需要执行任何操作 - 只需将其直接装入,图像视图将图像调整为正确的尺寸。

但是,如果您要创建一个新的图像视图,那么您需要创建一个注意UIScreen分辨率的框架,如此(不幸的是,您不能将scale属性设置为只读):

CGRect newFrame = CGRectZero; 
newFrame.size.width = (anImage.size.width/[UIScreen mainScreen].scale); 
newFrame.size.height = (anImage.size.height/[UIScreen mainScreen].scale); 

这假设您的网络服务意识到设备的屏幕是否是视网膜;有些服务会自动检测,有些服务会要求您事先告诉他们。因人而异。

+0

我试图记录图像的大小,并发现如果我把@ 2x放在'[UIImage imageNamed:]'中,那么我会得到真正的像素分辨率。但是,如果我没有包含它,我将得到点系统中的一半分辨率。我已经读过,我不应该包含@ 2x,因为iOS会自行决定设备是否为视网膜,并加载适当的图像。所以在“设备”中,不应该将非视网膜和视网膜的大小设置为相同的大小(尽管大小不同)? – harinsa

+0

嗯......看起来iOS已经在imageNamed:implementation中向下缩放图像。我已经用模拟器重现了这一点。奇怪的... –

+0

我检查过,在'imageNamed:'中没有明确的'@ 2x'的'@ 2x'图像的比例自动设置为2.0。 – harinsa