2013-09-22 2 views
5

Можно ли объединить два или более разных BMP-изображения одного размера в один, накладываясь друг на друга? Точно так же, как это делалось в Windows XP MS Paint: вставка одного изображения в другое, при этом вторичный цвет был прозрачным.Наложение изображений одним изображением

Example

+5

Конечно возможное. Совершено [много этого] (http://english.rejbrand.se/algosim/manual/pmproc/pmproc.html). –

+1

@AndreasRejbrand: спасибо за эту ссылку и, более конкретно, за контент. Отличная ссылка. –

ответ

9

Вы можете использовать Transparent свойство TBitmap к этому эффекту. Так как ваши растровые изображения имеют черную рамку, автоматический прозрачный цвет (первый пиксель данных изображения) не будет работать, и вам необходимо также установить свойство TransparentColor в 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

Работает отлично! Просто обратите внимание на кого-то, использующего этот код, убедитесь, что bmp1 и bmp2 будут иметь одинаковый размер. Если bmp2 меньше, чем bmp1, bmp2 будет помещен в верхний левый угол изображения. –

3

В случае второго растрового изображения является черно-белый, вы можете использовать его в качестве маски в операции растра с BitBlt (передачи битового блока), следующим образом:

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); 
Смежные вопросы