2013-05-30 51 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