Ho bisogno di determinare se un'immagine png contiene trasparenza - quale sarebbe il codice più efficiente per raggiungere questo obiettivo?Rilevamento della trasparenza in un'immagine
risposta
Converti il png in un pixelbuffer e usa vimage per calcolare gli istogrammi delle distribuzioni di colore. Quindi controlla l'istogramma del canale alfa. il vimage è molto più veloce che passare attraverso i pixel uno per uno.
CVPixelBufferRef pxbuffer = NULL;
vImagePixelCount histogramA[256];
vImagePixelCount histogramR[256];
vImagePixelCount histogramG[256];
vImagePixelCount histogramB[256];
vImagePixelCount *histogram[4];
histogram[0] = histogramA;
histogram[1] = histogramR;
histogram[2] = histogramG;
histogram[3] = histogramB;
vImage_Buffer vbuff;
vbuff.height = CVPixelBufferGetHeight(pxbuffer);
vbuff.width = CVPixelBufferGetWidth(pxbuffer);
vbuff.rowBytes = CVPixelBufferGetBytesPerRow(pxbuffer);
vbuff.data = pxbuffer;
vImage_Error err=vImageHistogramCalculation_ARGB8888 (&vbuff,histogram, 0);
if (err != kvImageNoError) NSLog(@"%ld", err);
BOOL transparent;
for(int i=1;i<256;i++){
if(histogram[0][i]>0) transparent=YES;
}
vimage presuppone che i colori siano ordinati ARGB nel buffer. Se hai qualcos'altro, ad es. BGRA, basta controllare l'istogramma [3] [i].
È ancora più veloce dividere prima il buffer in quattro buffer planari utilizzando vImageConvert_ARGB8888perPlanar8 e quindi eseguire il calcolo dell'istogramma sul buffer alfa utilizzando vImageHistogramCalculation_Planar8.
Se si utilizza iOS7 e versioni successive è possibile aprire il png come CGImage e utilizzare vImageBuffer_initWithCGImage per convertirlo direttamente in un buffer vimage (vedere la sessione 703 al WWDC 2014).
Infine, un'alternativa sarebbe utilizzare Core Image per calcolare l'istogramma.
- 1. Rilevamento della griglia in MATLAB
- 2. rilevamento della piattaforma in cmake
- 3. Rilevamento della disconnessione della presa?
- 4. Rilevamento della posizione UIScrollView
- 5. Rilevamento dello stato della chiamata in iOS4
- 6. Rilevamento della distruzione globale in Perl
- 7. Rilevamento della catena del metodo in PHP?
- 8. Rilevamento dello scaricamento della pagina in angularjs
- 9. Rilevamento della larghezza: auto in jQuery
- 10. Rilevamento automatico della console in perl
- 11. Rilevamento della linea OpenCV in generale
- 12. Come convertire rgba in un esadecimale con correzione della trasparenza?
- 13. Rilevamento della modifica di JComboBox
- 14. Rilevamento della connessione desktop remota
- 15. Rilevamento dell'uso attivo della telecamera
- 16. rilevamento della dimensione della pagina di memoria
- 17. Rilevamento della collisione attraverso l'array
- 18. Rilevamento R della versione Blas
- 19. Rilevamento della latenza di AirPlay
- 20. Rilevamento della chiusura della connessione HTTP in Rails
- 21. rilevamento della chiusura (o scaricamento) della pagina in asp.net mvc3
- 22. UINavigationController trasparenza?
- 23. e trasparenza
- 24. Soluzione alternativa per il bug della trasparenza di ImageList?
- 25. Rilevamento della prima esecuzione di un'app
- 26. Rilevamento delle dimensioni della finestra suddivisa
- 27. Rilevamento fisico della scheda seriale USB
- 28. Rilevamento della fine del flusso su popen.stdout.readline
- 29. Rilevamento della chiusura HTTP usando inet
- 30. Rilevamento della frequenza esatta del segnale Bluetooth
È un peccato che SO venga invasa da individui che non hanno nulla da contribuire oltre a voti bassi e richieste ravvicinate a domande legittime. Grazie a @Sten per la tua grande risposta. – RunLoop