2009-11-10 7 views
12

Fondamentalmente sto scaricando le immagini da un server web e quindi li memorizzo sul disco, ma prima di farlo desidero mascherarle. Sto utilizzando il codice di mascheramento tutti sembrano puntare a che si può trovare qui: http://iosdevelopertips.com/cocoa/how-to-mask-an-image.htmlScrittura di un'immagine mascherata su disco come file PNG

Cosa succede, però, è che l'immagine viene visualizzata bene, ma la versione che viene scritto sul disco con

UIImage *img = [self maskImage:[UIImage imageWithData:data] withMask:self.imageMask]; 
[UIImagePNGRepresentation(img) writeToFile:cachePath atomically:NO]; 

ha il canale alfa invertito se confrontato con quello visualizzato in seguito (utilizzando la stessa istanza UIImage qui).

Qualche idea? Ho bisogno che la versione della cache sia mascherata, altrimenti la visualizzazione delle immagini in una vista tabella è terribilmente lenta se devo mascherarle ogni volta.

Edit: Quindi sì, UIImagePNGRepresentation (img) sembra invertire il canale alfa, non ha nulla a che fare con il codice che scrive sul disco, che è piuttosto ovvio ma ho controllato comunque.

+0

Si ottiene lo stesso risultato se si utilizza UIImageJPEGRepresentation? Non sto suggerendo di passare a JPEG. Mi chiedo solo se ha lo stesso effetto. –

+0

Proverò, anche se JPEG non ha lo scopo di avere una maschera alfa. –

+0

Stranamente il JPEG sembra a posto, la maschera è stata applicata correttamente. –

risposta

5

Vedere la descrizione in CGImageCreateWithMask in CGImage Reference:

L'immagine risultante dipende dal fatto che il parametro maschera è una maschera di un'immagine o un'immagine. Se il parametro maschera è una maschera immagine, i campioni sorgente della maschera immagine si comportano come un valore alfa inverso. Ovvero, se il valore di un campione sorgente nella maschera immagine è S, la regione corrispondente nell'immagine viene miscelata con la destinazione utilizzando un valore alfa di (1-S). Ad esempio, se S è 1, la regione non viene dipinta, mentre se S è 0, la regione è completamente dipinta.

Se il parametro maschera è un'immagine, funge da maschera alfa per fondere l'immagine sulla destinazione. I campioni di origine della maschera 'agiscono come un valore alfa. Se il valore del campione sorgente in maschera è S, allora la regione corrispondente nell'immagine viene mescolata con la destinazione con un alfa di S. Ad esempio, se S è 0, allora la regione non è dipinta, mentre se S è 1, la regione è completamente dipinta.

Sembra per qualche motivo che la maschera di immagine sia trattata come un mask image da mascherare durante il salvataggio. Secondo:

per salvare correttamente con UIImagePNGRepresentation, ci sono diverse scelte:

  1. Utilizzare la versione inversa della maschera dell'immagine.
  2. Utilizzare "immagine maschera" anziché "maschera immagine".
  3. Eseguire il rendering su un contesto bitmap e quindi salvarlo, come indicato da epatel.
0

Hai visto questo post? Non sono sicuro se è rilevante, ma sembra essere simile

Any idea why this image masking code does not work?

+0

Non sembra essere correlato in quanto sono ben consapevole delle peculiarità della creazione di una maschera, ho testato con diversi formati per la maschera ecc. Inoltre la mia maschera si applica bene quando viene visualizzata, solo quando si salva l'immagine già mascherata il disco si inverte il canale alfa. –

14

ne dite di disegno in una nuova immagine, e quindi salvare questo?

UIGraphicsBeginImageContext(img.size); 
[img drawAtPoint:CGPointZero]; 
UIImage *newImg = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
[UIImagePNGRepresentation(newImg) writeToFile:cachePath atomically:NO]; 

(non testata)

+0

Sì, funziona. Tuttavia non è l'ideale, poiché secondo le mie (molto rozze) misurazioni ci vuole più tempo per ridisegnare l'immagine come nel codice sopra (meno '-writeToFile: atomically') piuttosto che per disegnare l'immagine da zero usando i comandi della Core Graphics. Avete ulteriori informazioni sul perché il vostro suggerimento funziona e se esiste un modo più efficiente di fare la stessa cosa? – Stuart

+0

La mia ipotesi sarebbe che la maschera è una "cosa" separata dall'immagine. Qualcosa UIKit/Quartz può gestire e disegnare, ma quando si desidera salvarlo come immagine con maschera come canale alfa, l'immagine deve essere composta con la maschera per ottenere la sua "bitmap" finale prima di salvarla. – epatel

+0

@epatel Ti amo, amico. Mi sono liberato i capelli. Sto cercando di mascherare e salvare su file (cache) prima che il mio normale codice legga dal file (in questo modo maschera una volta, non ogni volta che viene visualizzata la vista) e il tuo codice era necessario dopo "UIImage * maskedIcon = [UIImage imageWithCGImage: maskedImageRef]; " per farlo funzionare. Grazie! –

Problemi correlati