2010-07-18 6 views
5

Tengo un UIImage y me gustaría poner sus datos en un archivo y luego usé un archivo asignado para guardar algo de memoria. Aparentemente, los datos de UIImage son privados y no es posible acceder a ellos. ¿Tendría alguna sugerencia para resolver eso?Memoria Mapa UIImage

Gracias!

Respuesta

8

Si desea mapear la memoria de los datos de imagen codificados, mmap un archivo y proporcionar una referencia a los datos pasando un CGDataProviderRef a CGImageCreate.

mapped = mmap(NULL , length , ...); 
provider = CGDataProviderCreateWithData(mapped , mapped , length , munmap_wrapper); 
image = CGImageCreate(... , provider , ...); 
uiimage = [UIImage imageWithCGImage:image]; 
... 

Dónde munmap_wrapper es algo como esto:

// conform to CGDataProviderReleaseDataCallback 
void munmap_wrapper(void *p , const void *cp , size_t l) { munmap(p , l); } 

Si desea asignar memoria de los píxeles reales, en lugar de los datos de origen codificados, deberías hacer algo similar con un CGBitmapContext. También crearía el proveedor y la imagen para que la imagen se refiera a los mismos píxeles que el contexto. Lo que se dibuja en el contexto será el contenido de la imagen. El ancho, alto, espacio de color y otros parámetros deben ser idénticos para el contexto y la imagen.

context = CGBitmapContextCreate(mapped , ...); 

En este caso, la duración será al menos bytes_per_row * Altura bytes por lo que el archivo debe ser al menos tan grande.

Si tiene una imagen existente y desea mmap los píxeles, cree el contexto del mapa de bits con el tamaño y el espacio de color de su imagen y use CGContextDrawImage para dibujar la imagen en el contexto.

No mencionó la fuente de su imagen, pero si la está creando en tiempo de ejecución, sería más eficiente crearla directamente en el contexto del mapa de bits. Cualquier creación de imagen requiere un contexto de mapa de bits detrás de escena, por lo que podría ser la memoria mapeada desde el principio.

+0

Gracias por esta gran respuesta! Voy a investigar eso. No estoy muy familiarizado con el mapeo de memoria, pero estaba buscando maneras de mantener mi uso de memoria bajo. Sí, tengo acceso al mapa de bits ya que manipulo este mapa de bits y luego lo convierto en un UIImage utilizando un CGDataProviderRef y CGImageCreate. Así que supongo que podría hacer el mapeo de la memoria en este punto dando una memoria de datos mapeados al CGDataProviderRef. – Kamchatka

+0

Puede intentar 'MAP_ANON' si no le importa el archivo. Con eso puedes tratar a mmap casi como malloc. – drawnonward

+0

¿Puedo usar MAP_ANON sin especificar un archivo? Si hago un mmap y luego intento membrar los datos con el mismo tamaño que mmap, obtengo un EXC_BAD_ACCESS. – Kamchatka

Cuestiones relacionadas