2012-07-25 22 views
9

Tengo una imagen grande que es demasiado grande para cargarla en la memoria, pero solo me interesa un subconjunto de píxeles dentro de esa imagen grande. ¿Es posible decodificar en la memoria solo este subconjunto de píxeles? Sé que en Android hay una clase en la API para hacer exactamente esto llama BitmapRegionDecoder son algo asíios Decodificar parte de una imagen

encontré CGDataProviderCreateSequential pero necesita los píxeles primas en el constructor ...

En este momento estoy haciendo algo como esto:

UIImage* srcImage = ...; 
    CFDataRef cgImgDataRef = CGDataProviderCopyData(CGImageGetDataProvider(srcImage.CGImage));//After this call, all pixels are decoded into memory and the app crashes 
char* imageData = (char*)CFDataGetBytePtr(cgImgDataRef); 
+0

La sabiduría actual dice que la forma de hacerlo es dividir la imagen en mosaicos y cargar de forma perezosa solo los mosaicos que se muestran actualmente en el nivel de zoom apropiado. ¿Exactamente qué tan grande es esta imagen (en dimensiones de píxeles)? – warrenm

+0

alrededor de 4096x3072 pero la cuestión es que quiero cargar una ficha de la imagen grande directamente en mi aplicación gl gl ES. Así que necesito extraer los píxeles necesarios y llamar a glTexImage2D (...) con mis datos subpíxel – AkademiksQc

+0

¿El tamaño de la subimagen que extraes es siempre el mismo o varía? ¿Cuál es el rango? – warrenm

Respuesta

10

La única forma posible de esto podría funcionar es si crea una CGImageSourceCreateWithData() (o cualquier URL), a continuación, crear una CGImageRef usando CGImageCreateWithJPEGDataProvider o CGImageCreateWithPNGDataProvider. Con ese CGImageRef, puede INTENTAR usar CGImageCreateWithImageInRect() y sacar una subsección de la imagen grande.

Si lo que estás tratando de hacer es poner la imagen en mosaico, aclara tu pregunta, ya que tendrías más información para ti.

+0

¡wow está realmente funcionando! Anteriormente estaba cargando los datos jpeg usando [UIImage imageNamed ...]. Parece que CGImageCreateWithJPEGDataProvider + CGImageCreateWithImageInRect() solo decodifica la parte necesaria. Antes, siempre se bloqueaba debido a la poca memoria, ahora funciona. Verificaré la documentación para ver si hay más explicaciones sobre esos métodos. Para su información, el objetivo es cargar la imagen grande desde el disco y enviarla a OpenGL. Necesito configurarlo dependiendo del tamaño máximo de la textura opengl admitido en el dispositivo. – AkademiksQc

+0

Para archivos JPEG realmente grandes puedes usar libjpeg-turbo y una biblioteca de código abierto disponible libremente que usa NEON para la aceleración de armv7. Lo uso en mi proyecto PhotoScrollerNetwork para crear mosaicos y mostrar 18000x18000 imágenes de la NASA en el teléfono. –

+0

ok lo investigaré ... pero ¿no es solo la decodificación de software? Pensé que tenía que usar iOS SDK para el decodificador de hardware jpeg incorporado. – AkademiksQc

Cuestiones relacionadas