2010-07-20 38 views
50

Görüntülerin, iPhone istemcisinin türüne göre doğru boyutta görüntü sağlayan bir sunucudan yüklenen ham verilerden başlatılması gerekiyor.Retina ekranı ve [UIImage initWithData]

640x960 göstergesinde 2.0 olarak ölçek değerini ayarlamam gerektiğini biliyordum, ancak bu salt okunur bir özelliktir ve initWithData kullanılırken init sırasında ayarlanamaz.

Herhangi bir fikrin var mı?

+3

Soru başlığını bulmayı kolaylaştırmak için "UIImage'ın ölçek özelliğini nasıl değiştirebilirim?" Şeklinde değiştirmeyi önerebilir miyim? – Rivera

+1

Vay, bu soruyu 4 yıl önce sordum. Sanırım bırakacağım, teşekkürler. – Sam

cevap

93

Ben bunu bir @ 2x görüntü olduğunu telefonunu anlatmak için resim verilerine kendisinde gömebilirsiniz şeyin farkında değilim, ama böyle bir şey çalışması gerekir: iOS 6.0 UIImage yöntemi vardır

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

olduğunda mümkün olmayan @ 2x son ekine sahipse, bu benim için de düzeltildi, teşekkürler! Bir görüntü üzerinde metin çiziyordum ve ortaya çıkan görüntü üzerinde ölçeği düzeltmek için buna ihtiyacım vardı. – Jason

+0

Benim için de Perfekt ... Ama bir görüntüyü UIImagePNGrepresentation ile saklayıp doğru bir şekilde geri almak istiyorsak neden bu kadar düşük seviyeli şeyleri uygulamak zorundayız? Bu Apple gibi değil. \t \t \t CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData ((CFDataRef) ); \t \t \t CGImageRef cgHeaderImage = CGImageCreateWithPNGDataProvider (dataProvider, NULL, NO, kCGRenderingIntentDefault); \t \t \t CGDataProviderRelease (dataProvider); \t \t \t headerCell.headerImage.image = [Bu tabloyu kapaBu tabloyu aç CGImageRelease (cgHeaderImage); – Gerd

+0

PNGRepresmentin "ölçek" kavramına sahip olmaması nedeniyle (benzer şekilde, JPEGReprestasyonunun saydamlık kavramı yoktur); görüntü sadece CGImage tarafından yüklenir. Teoride görüntü DPI'sını kullanabiliyor olsanız da, CGImage'ın DPI bilgisini basitçe görmezden geldiğinden eminim, böylece UIImage'ın ek ayrıştırma yapmak zorunda kalacağını düşünüyorum.Ayrıca, DPI bilgisi * neredeyse her zaman anlamsız *: Mac varsayılan olarak 72, Windows varsayılanı 96 ve çoğu dijital kamera varsayılan olarak 300 (ve "DPI" bir fotoğrafın tamamen anlamsız olduğunu; Açısal çözünürlük/FOV ve objektif bozulma istiyorum eğrisi). –

-4

AFAIK, ölçek değerini kendiniz ayarlamanıza gerek yoktur. OS, sizin için piksel çeviri noktalarını ele alacaktır.

+0

Sadece bir UIImage'ı veriden başlatırsam, iPhone 4 üzerinde büyütülür (örneğin, 320x480 boyutunda bir görüntü, iPhone 4'te tam ekran olacak). Bunu bir şekilde engellemem gerekiyor ki yüksek çözünürlüklü görüntüleri kullanabilmem için – Sam

+0

Ah bunu bilmiyordum, teşekkürler! – Rengers

+2

Bu sadece bir resim initWithData ' –

18

yana + imageWithData:scale:, retina için 2.0 ölçeğini kullanabilirsiniz.

7

2.0f yerine, ölçek parametresi olarak [[UIScreen mainScreen] scale] iletebilirsiniz. Sunucu verileri ile görüntü oluştururken Sonra

BOOL isRetina(){ 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
     return [[UIScreen mainScreen] scale] == 2.0; 
    } 
    return NO; 
} 

İstersen .m veya bir ithal sınıfına

-1

koymak bu (function IMAO çağrılırken c sözdizimi güzel):

[UIImage imageWithData:dataFromServer scale:isRetina()?2:1]; 
+2

Neden sadece [UIImage imageWithData: dataFromServer scale: [UIScreen mainScreen] .scale] 'demek değil? –

+1

Bu iPhone 6+ için kırılacak. –