2010-07-20 15 views
50

Necesito inicializar imágenes de datos brutos descargados de un servidor que proporciona el tamaño correcto de imagen en función del tipo de cliente de iPhone.Retina display y [UIImage initWithData]

Sé que debería establecer el valor de escala en 2,0 en la pantalla de 640x960, sin embargo, esta es una propiedad de solo lectura y no se puede configurar durante el inicio cuando se usa initWithData.

¿Alguna idea?

+3

¿Puedo sugerir cambiar el título de la pregunta a "Cómo cambiar la propiedad de escala de UIImage" para que sea más fácil de encontrar? – Rivera

+1

Wow, hice esta pregunta hace más de 4 años. Creo que lo dejo, gracias. – Sam

Respuesta

93

No estoy al tanto de todo lo que se puede incrustar en los propios datos de imagen para decirle al teléfono que se trata de una imagen de @ 2x, pero algo como esto debería funcionar:

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

Esto también lo solucionó, gracias. Estaba dibujando texto en una imagen y necesitaba esto para mantener la escala correcta en la imagen resultante. – Jason

+0

Perfekt para mí también ... Pero ¿por qué tenemos que implementar esas cosas de bajo nivel si almacenamos una imagen con UIImagePNGrepresentation y queremos que vuelva correctamente? Eso no es como Apple. \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 = [UIImage imageWithCGImage: cgHeaderImage scale: 2.0 orientation: UIImageOrientationUp]; CGImageRelease (cgHeaderImage); – Gerd

+0

Debido a que PNGRepresentation no tiene noción de "escala" (de manera similar, JPEGRepresentation no tiene noción de transparencia); la imagen simplemente es cargada por CGImage. Aunque en teoría podría usar imágenes DPI, estoy bastante seguro de que CGImage simplemente ignora la información de DPI, por lo que UIImage tendría que realizar un análisis adicional.Además, la información DPI * casi siempre no tiene sentido *: Macs por defecto a 72, Windows por defecto a 96 y la mayoría de las cámaras digitales por defecto a 300 (y el "DPI" de una foto es completamente sin sentido, quiero resolución angular/FOV y distorsión de la lente curva). –

-4

AFAIK no necesita establecer el valor de la escala usted mismo. El sistema operativo manejará la traducción de puntos a píxeles por usted.

+0

Si solo inicializo un UIImage a partir de los datos, se escalará en el iPhone 4. (por ejemplo, una imagen de 320x480 aparecerá en pantalla completa en el iPhone 4). Necesito evitar esto de alguna manera para poder usar imágenes de alta resolución – Sam

+0

¡Ah, no lo sabía, gracias! – Rengers

+2

Eso es solo si una imagen tiene el sufijo @ 2x que no es posible cuando 'initWithData' –

18

Desde iOS 6.0 UIImage tiene método + imageWithData:scale:, puede pasar 2.0 como escala para la retina.

7

Puede pasar [[UIScreen mainScreen] scale] como el parámetro de escala en lugar de 2.0f.

-1

ponga esto en su .m si desea o en una clase importada (la sintaxis de C es más agradable cuando se llama a la función IMAO)

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

Luego, cuando la creación de la imagen con los datos del servidor:

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

¿Por qué no simplemente llamar a '[UIImage imageWithData: dataFromServer scale: [UIScreen mainScreen] .scale]'? –

+1

Esto se romperá para el iPhone 6+. –

Cuestiones relacionadas