2015-08-11 8 views
5

Ho trovato una domanda simile qui: iOS 8 (Swift) How do I get rid of this error: ImageIO: PNG zlib error? tuttavia ci sono alcune differenze.Photos.framework genera <Error>: ImageIO: errore zlib PNG ma fornisce ancora UIImage

Ottengo il PHAsset da un selettore, in cui l'immagine viene scaricata e visualizzata correttamente (utilizza la classe PHCachingImageManager).

Ma, quando si tenta di richiedere l'immagine in seguito dalla Asset in questo modo:

[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:AssetTargetSize 
    contentMode:PHImageContentModeAspectFit options:nil 
    resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { 
     if (result) 
      _image = result; 
} 

la variabile result è un puntatore ad un oggetto UIImage ma non è valido - non posso trasformarlo in NSData né può Ho una rapida occhiata a xcode.

Nel registro ho appena ricevuto il seguente messaggio: <Error>: ImageIO: PNG zlib error e nient'altro.

Ho provato a rendere la richiesta sincrona come suggerito nella domanda collegata, ma non ha fatto alcuna differenza.

L'immagine puntata da PHAsset è visualizzabile sia nell'app Foto che nel selettore foto.

+0

"Ho cercato di fare la richiesta sincrona come suggerito ..." Potete fornire il codice aggiornato, per favore? Aiuta anche a vedere come stai impostando AssetTargetSize ... – jperl

+1

@KickimusButticus Dal momento che non ha funzionato ho ripristinato il mio codice su ciò che è scritto (preferirei asincrono), tuttavia è stato fatto creando classe di opzioni e solo cambiando la proprietà sincrona a 'SÌ'. 'AssetTargetSize' è un const statico di tipo' CGSize' che per ora è hardcoded. Questo codice funziona la maggior parte del tempo, tuttavia ottengo questo errore senza alcuna informazione aggiuntiva per alcune immagini - ma poiché l'immagine è caricata nel selettore di immagini - dubito che questo sia un problema con le mie immagini –

+0

tutte le immagini quadrate scattate dalla fotocamera .app ottieni lo stesso errore – qiz

risposta

0

È necessario abilitare l'opzione sincrona.

PHAsset *asset = array[i]; 
      PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; 
      options.synchronous = YES; 
      PHImageManager *imageManager = [PHImageManager defaultManager]; 
      [imageManager requestImageForAsset:asset targetSize:CGSizeMake(200, 200) contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { 
       badge = (UIImage *)result; 
      }]; 
0

Ho risolto questo impostando le suddette opzioni sincrone true oltre ad impostare la dimensione esternamente alla chiamata a requestImageForAsset. Entrambi, per me, era necessario che lo funzionasse. In Swift 2. x:

let aSize = CGFloat(200) // it's really a constant elsewhere in the project 
    let targetSize = CGSizeMake(aSize, aSize) 
    let options = PHImageRequestOptions() 
    options.synchronous = true 

    PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: .AspectFit, options: options, resultHandler: { (image, info) -> Void in 
     guard let imageFor = image else { return } 
     // use (now-unwrapped) imageFor here 
    }) 
Problemi correlati