2013-09-22 15 views
5

È possibile unire due o più immagini bmp diverse della stessa dimensione sovrapponendole una sopra l'altra? Allo stesso modo in Windows XP MS Paint: incollare un'immagine in un'altra, con il colore secondario trasparente.Sovrapposizione di immagini in un'immagine

Example

+5

Certamente possibile. Fatto [molto di questo] (http://english.rejbrand.se/algosim/manual/pmproc/pmproc.html) io stesso. –

+1

@AndreasRejbrand: grazie per questo link e più specificamente il contenuto lì. Grande riferimento. –

risposta

9

È possibile utilizzare Transparent proprietà di TBitmap in tal senso. Poiché le tue bitmap hanno un bordo nero, il colore trasparente automatico (il primo pixel dei dati dell'immagine) non funzionerebbe e devi anche impostare la proprietà TransparentColor su "clWhite".

var 
    bmp1, bmp2: TBitmap; 
begin 
    bmp1 := TBitmap.Create; 
    bmp1.LoadFromFile('...\test1.bmp'); 

    bmp2 := TBitmap.Create; 
    bmp2.LoadFromFile('...\test2.bmp'); 

// bmp2.PixelFormat := pf24bit; // with 32 bit images I need this, don't know why 
    bmp2.Transparent := True; 
    bmp2.TransparentColor := clWhite; 
    bmp1.Canvas.Draw(0, 0, bmp2); // draw bmp2 over bmp1 

    // this is how the merged image looks like 
    Canvas.Draw(0, 0, bmp1); 
    .. 
+0

Funziona perfettamente! Solo una nota per qualcuno che usa questo codice, assicurati che bmp1 e bmp2 abbiano le stesse dimensioni. Se bmp2 è più piccolo di bmp1, allora bmp2 sarà collocato nell'angolo in alto a sinistra dell'immagine. –

3

Nel caso del secondo bitmap è bianco e nero, è possibile utilizzarlo come maschera in un'operazione raster con BitBlt (trasferimento bit-block), come segue:

Windows.BitBlt(Bmp3.Canvas.Handle, 0, 0, Bmp3.Width, Bmp3.Height, 
    Bmp1.Canvas.Handle, 0, 0, SRCCOPY); 
    Windows.BitBlt(Bmp3.Canvas.Handle, 0, 0, Bmp3.Width, Bmp3.Height, 
    Bmp2.Canvas.Handle, 0, 0, SRCAND); 
Problemi correlati