2010-07-26 11 views
14

En el código de muestra de iPhone "PhotoScroller" de WWDC 2010, muestran cómo hacer una buena imitación de la aplicación Fotos con desplazamiento, zoom y paginación de imágenes. También colocan las imágenes en mosaico para mostrar cómo mostrar imágenes de alta resolución y mantener un buen rendimiento.¿Es posible crear un mosaico de imágenes en un UIScrollView sin tener que crear manualmente todas las teselas?

El mosaico se implementa en el código de muestra al tomar imágenes pre escaladas y cortadas para diferentes resoluciones y colocarlas en la cuadrícula que compone toda la imagen.

Mi pregunta es: ¿hay alguna manera de hacer mosaicos de imágenes sin tener que pasar manualmente por todas sus fotos y crear "mosaicos"? ¿Cómo es que la aplicación Fotos puede mostrar imágenes grandes sobre la marcha?

Editar Este es el código de la respuesta de Deepa a continuación:

- (UIImage *)tileForScale:(float)scale row:(int)row col:(int)col size:(CGSize)tileSize image:(UIImage *)inImage 
{ 
CGRect subRect = CGRectMake(col*tileSize.width, row * tileSize.height, tileSize.width, tileSize.height); 
CGImageRef tiledImage = CGImageCreateWithImageInRect([inImage CGImage], subRect); 
UIImage *tileImage = [UIImage imageWithCGImage:tiledImage]; 
return tileImage; 
} 

Respuesta

12

Aquí va el fragmento de código para la generación de imagen en mosaico:

En el código fuente PhotoScroller reemplazar tileForScale: Fila: Col: con lo siguiente:

availableMouse del inImage - Imagen que desea crear azulejos

- (UIImage *)tileForScale: (float)scale row: (int)row column: (int)col size: (CGSize)tileSize image: (UIImage*)inImage 
{ 
    CGRect subRect = CGRectMake(col*tileSize.width, row * tileSize.height, tileSize.width, tileSize.height); 
    CGImageRef tiledImage = CGImageCreateWithImageInRect([inImage CGImage], subRect); 
    UIImage *tileImage = [UIImage imageWithCGImage: tiledImage]; 
    return tileImage; 
} 

Saludos, Deepa

+0

Deepa, gracias por el código. Estoy recibiendo un montón de errores cuando intento usarlo. ¿Te importaría insertar como código para que se formatee correctamente? Es posible que esté cometiendo un error de transcripción simple. ¡Gracias! – Jonah

+0

Guau, lo tengo funcionando. Muchas gracias. Es un poco lento sobre la marcha, pero hace lo que se supone que debe hacer. Pegaré el código en mi pregunta anterior. – Jonah

+0

@Jonah: Esta debería ser la respuesta aceptada. – iwasrobbed

5

he encontrado este que puede ser de ayuda: http://www.mikelin.ca/blog/2010/06/iphone-splitting-image-into-tiles-for-faster-loading-with-imagemagick/

Usted simplemente se ejecuta en el Terminal como una concha script en tu Mac.

+0

Eso es genial y podría ahorrar mucho tiempo. Pero, lo que estaba buscando es una forma de hacerlo dentro del teléfono. Por ejemplo, la aplicación Fotos puede desplazarse rápidamente/acercar incluso imágenes grandes. Mi suposición es que teja las imágenes automáticamente. Pero, puedo estar equivocado. – Jonah

3

Lo siento, Jonah, pero creo que no puedes hacer lo que quieras.

He estado implementando una aplicación de cómic usando el mismo ejemplo como referencia y tuve la misma duda. Finalmente, me di cuenta de que, incluso si pudieras cargar la imagen y cortarla en mosaicos la primera vez que la usas, no deberías. Hay dos razones para eso:

  1. Realiza el mosaico para ahorrar tiempo y ser más receptivo. La carga y el mosaico llevan tiempo para una imagen grande.
  2. La razón anterior es particularmente importante la primera vez que el usuario ejecuta la aplicación.

Si estas dos razones no tienen sentido para ti, y aún quieres hacerlo, usaría Quartz para crear las teselas. La función CGImage CGImageCreateWithImageInRect sería mi punto de partida.

+0

Definitivamente de acuerdo en hacer el mosaico usted mismo en el programa ... tendría que cargar la imagen en la memoria que, para empezar, evita el propósito del mosaico (para ahorrar memoria). Podría subir imágenes a un servidor y hacer que precortara las imágenes y luego volver a descargarlas. – iwasrobbed

+0

Eso tiene sentido. Pero, mi pregunta es entonces: ¿Cómo diablos lo hace la aplicación de fotos? Alguien puede enviarte una foto de 10mb y funciona perfectamente en la aplicación de fotos. Entonces, si no estaba dentro de la aplicación, ¿cómo lo hicieron? – Jonah

+0

Como mencioné, se puede hacer con Quartz y el impacto no es tan grande cuando el usuario supone que está importando una foto, creo. En cuanto a iTunes, puede leer un mensaje que dice algo así como "Optimizar fotos para el iPod", que supongo que es para el mosaico –

2

Muchos formatos de imagen son compatibles con la decodificación basada en regiones. En lugar de cargar toda la imagen en la memoria, descomprimir todo y descartar todo excepto la región de interés (ROI), puede cargar y decodificar solo el ROI, a pedido. En su mayor parte, esto elimina la necesidad de pregenerar y guardar mosaicos de imágenes. Nunca he trabajado con ImageMagick pero me sorprendería si no pudiera hacerlo. (Me he hecho uso de la API Java Advanced Imaging (JAI), que no se te va a ayudar en el iPhone ...)

He jugado con el ejemplo PhotoScroller y la forma en que trabaja con tiles pregenerados es solo para demostrar la idea detrás de CATiledLayer, y hacer un proyecto autónomo de trabajo. Es fácil reemplazar la estrategia de carga de mosaicos de imágenes: simplemente reescriba el método TilingView tileForScale:row:col: para devolver un azulejo UIImage de alguna otra fuente, ya sea Quartz o ImageMagick o lo que sea.

+0

¡Si lo que dice es correcto, esto parece una solución increíble! ¿Sabes cómo conseguiría el retorno de la inversión sin cargar toda la imagen en la memoria con ImageMagick? ¿Será un cultivo sencillo, similar a lo que esta persona está haciendo el trabajo? ¿Algo así cargará toda la imagen en la memoria? http://www.mikelin.ca/blog/2010/06/iphone-splitting-image-into-tiles-for-faster-loading-with-imagemagick/ – Homeschooldev

3

respuesta de Deepa anterior cargará toda la imagen en la memoria como una UIImage (la variable de entrada en su función), derrotando el propósito de embaldosar.

Cuestiones relacionadas