2011-01-19 8 views
8

Scaricare un'immagine dalla rete e mostrarlo in una UIImageView è abbastanza facile. Tuttavia, ciò richiede che l'immagine sia completamente scaricata prima che venga mostrata all'utente, annullando completamente le immagini progressive JPEG (e PNG).Come si visualizza un JPEG progressivo in un UIImageView durante il download?

Come è possibile eseguire il rendering delle immagini parzialmente scaricate mentre il trasferimento è in corso? Immagino che l'SDK abbia una funzione di callback che aggiorni l'immagine, ma non riesco a trovare una funzione del genere. È possibile con l'SDK iOS attuale?

risposta

0

Hai provato a rendere l'UIImage parzialmente come ha fattoReceiveData viene chiamato ...? Qualcosa di simile ...

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    //TODO: add some error handling in case the image could not be created 
    UIImage *img=[UIImage imageWithData:data]; 
    if (img) { 
     self.imageView.image=img; 
    } 
} 
+0

che non funziona così male come mi aspettavo quindi immagino lo farò per il momento. Eppure, è un po 'brutto il modo in cui l'immagine visualizza le aree non ancora scaricate dell'immagine e sembra essere molto peggio in termini di prestazioni rispetto alla progressiva decompressione dell'immagine come con il raw libjpeg a causa del ricalcolo completo dell'immagine. –

+0

Un altro approccio (il migliore, immagino) sarebbe utilizzare una libreria come libjpeg (se disponibile per iOS). – versatilemind

10

So che questo post ha circa 1 anno, ma solo nel caso in cui qualcuno è alla ricerca di esso, c'è un progetto chiamato NYXImagesKit che fa quello che state cercando.

Ha una classe denominata NYXProgressiveImageView che è una sottoclasse di UIImageView.

Tutto quello che dovete fare è:

NYXProgressiveImageView * imgv = [[NYXProgressiveImageView alloc] init]; 
imgv.frame = CGRectMake(0, 0, 320, 480); 
[imgv loadImageAtURL:[NSURL URLWithString:@"http://yourimage"]]; 
[self.view addSubview:imgv]; 
[imgv release]; 

Inoltre, una buona opzione è quella di salvare le immagini come interlaced in modo che si carichi di bassa qualità e migliorare con il download. Se l'immagine non è interlacciata, viene caricata dall'alto verso il basso.

+1

Grazie, non sapevo che 'ImageIO.framework' era in grado di farlo, e anche per diversi tipi di file. –

+0

'NYXProgressiveImageView' non carica la parte di bassa qualità del file jpeg progressivo. Mostra semplicemente l'immagine una volta scaricato tutto. – nickcheng

+0

È di base, non progressivo come app Facebook come – keywind

1

V'è ora una piccola libreria open-source sulla parte superiore del libjpeg-turbo che consente di decodifica e la visualizzazione JPEG progressivi facilmente:

let imageView = CCBufferedImageView(frame: ...) 
if let url = NSURL(string: "http://example.com/yolo.jpg") { 
    imageView.load(url) 
} 

vedere https://github.com/contentful-labs/Concorde