2012-05-20 4 views
5

Ho seguito due immagini, lo sfondo potrebbe essere un'immagine completamente diversa, ad es. non solo un semplice coloreQuarzo: acquisizione delle immagini diff di due immagini

Image number oneenter image description here

Quindi, fondamentalmente voglio ottenere l'immagine diff di queste due immagini cioè

enter image description here

L'immagine diff di due immagini è l'immagine con le stesse dimensioni, ma la I pixel sono impostati per essere trasparenti e non sono stati modificati. L'immagine della differenza è costruita dai diff pixel con il colore della seconda immagine

Sto cercando la soluzione basata sulle tecniche di grafica core, per favore non suggerire di eseguire tutti i pixel in loop. Mi interessa la performance.

Come sono nuovo per Quartz vorrei sapere è possibile ottenere questo con le maschere? Oppure suggerire un altro approccio!

aggiornamento sull'uso differenza modalità mescolando realtà se uso la differenza modalità non risolve il mio problema in quanto non tiene colori giusti dei pixel miscelazione. Se applico metodo di fusione differenza di cui sopra 2 immagini Prendo seguente

enter image description here

che sembra avere colori invertiti per i pixel e poi se li invertire ottengo seguente

enter image description here

Quale in realtà non è quello che volevo, in quanto i colori dei pixel sono completamente diversi

+0

risposta accettata a http : //stackoverflow.com/questions/3901404/create-a-mask-from-difference-between-two-images-iphone sembra che potrebbe aiutare. –

+0

@rokjarc grazie per il collegamento, ma la differenza metodo di fusione non è una soluzione nel mio caso, appena aggiornato le immagini di esempio per dimostrarlo. – deimus

+0

Cosa succede se si disegna un'immagine sull'altra dopo aver impostato 'CGContextSetBlendMode (kCGBlendModeDifference);' Non ti dà quello che cerchi? –

risposta

6

È possibile sfumare qualsiasi disegno in Core Graphics utilizzando

CGContextSetBlendMode(kCGBlendModeDifference); 

Disegnando la prima immagine e impostando la modalità di fusione sulla differenza e disegnando la seconda immagine si otterrà la differenza (come ho suggerito nel mio commento). Questo ti dà un'immagine invertita (come si vede nella tua domanda di aggiornamento). Per invertire l'immagine è possibile riempire lo stesso rect con il colore bianco usando (poiché la modalità di fusione è ancora impostata su "differenza").

CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0); 
CGContextFillRect(context, frame); 

codice di esempio per fare tutto questo (all'interno drawRect :) è visto di seguito.

CGContextRef context = UIGraphicsGetCurrentContext(); 

// Your two images 
CGImageRef img1 = [[UIImage imageNamed:@"Ygsvt.png"] CGImage]; 
CGImageRef img2 = [[UIImage imageNamed:@"ay5DB.png"] CGImage]; 

// Some arbitrary frame 
CGRect frame = CGRectMake(30, 30, 100, 100); 

// Invert the coordinates to not draw upside down 
CGContextTranslateCTM(context, 0, frame.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

// Draw original image 
CGContextDrawImage(context, frame, img1); 

// Draw the second image using difference blend more over the first 
CGContextSetBlendMode(context, kCGBlendModeDifference); 
CGContextDrawImage(context, frame, img2); 

// Fill the same rect with white color to invert 
// (still difference blend mode) 
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0); 
CGContextFillRect(context, frame); 
+0

Grazie per il codice David, ma come ho già detto il diff blending non è la soluzione da me, ho aggiornato la domanda con una migliore definizione di immagine differenza. In realtà l'immagine diff di due immagini è l'immagine con le stesse dimensioni ma i pixel sono impostati per essere trasparenti che non sono stati modificati. L'immagine della differenza è costruita dai diff pixel con il colore della seconda immagine – deimus

+1

Quindi, in sostanza, vuoi usare la maschera la seconda immagine dove ci sono delle differenze? –

+0

Sì esattamente! Qualche idea su come costruire la maschera? – deimus