2010-12-15 11 views
8

Tengo problemas con la forma en que iOS maneja los GIF animados. Sé que no puedes usar GIF animados en un UIImageView y tienes que usar animaciones personalizadas en el UIImageView.Imágenes GIF animadas recibidas como NSData a través de NSSocket no pueden dividir marcos

Pero ..

Tengo un servidor Java que envía imágenes GIF a través de un socketstream. El iOS (iPhone) recibe esa transmisión y la convierte en un tipo NSData. Logré capturar y mostrar esta imagen en UIImageView pero, como muchos de ustedes ya saben ... solo muestra el primer fotograma.

También encontré un código para decodificar ese GIF en imágenes separadas, pero ese código funciona desde un archivo GIF y no NSData.

Pregunta: ¿Cómo convierto el archivo NSData en imágenes separadas y las coloco en un NSArray para usarlo como animación?

Nota: En el NSData que se recibe se encuentran una imagen y un texto separados por un carácter raro. entonces el NSData se ve así: [imagen] [separador] [texto].

dispositivos

espero que alguien me puede dar algunos consejos o algunas muestras para trabajar con ..

Gracias de antemano, voy a seguir buscando hasta que usted o me encuentra una respuesta :)

+0

En vista de que hay múltiples imágenes en un objeto NSData, es su carácter separador también está presente entre el [ texto] y la siguiente [imagen]? – Endemic

+0

Bueno, envío 1 imagen GIF y algo de texto. Así que envío múltiples (o uno) fotogramas y luego un separador y luego el texto ... Así que no hay más imagen después del texto ... – stackr

Respuesta

14

A menos que las que se dirige antes de iOS 4, usa ImageIO.

NSMutableArray *frames = nil; 
CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)data, NULL); 
if (src) { 
    size_t l = CGImageSourceGetCount(src); 
    frames = [NSMutableArray arrayWithCapacity:l]; 
    for (size_t i = 0; i < l; i++) { 
     CGImageRef img = CGImageSourceCreateImageAtIndex(src, i, NULL); 
     if (img) { 
      [frames addObject:[UIImage imageWithCGImage:img]]; 
      CGImageRelease(img); 
     } 
    } 
    CFRelease(src); 
} 
+0

Funcionó para mí. Obtuve 'data' by' // get absolute file path: NSString * gifPath = [[NSBundle mainBundle] pathForResource: @ "ajax-loader" ofType: @ "gif"]; if (! GifPath) { NSLog (@ "error: ruta de archivo incorrecta"); } NSError * error = nil; // obtener bytes de imágenes: NSData * gifData = [NSData dataWithContentsOfFile: opciones de gifPath: nil error: & error]; if (! GifData) { NSLog (@ "error:% @", error); // NSLog (@ "error: error de imagen gif"); } ' –

2

hice un envoltorio que también se encarga de tiempo de animación basado en el código de anomia

https://gist.github.com/3894888

+0

Esto no es exactamente una respuesta. Él pregunta cómo, no un enlace a un contenedor. – Austin