2013-09-22 110 views
5

Có thể hợp nhất hai hoặc nhiều hình ảnh bmp khác nhau có cùng kích thước thành một bằng cách chồng lên nhau không? Tương tự như vậy trong Windows XP MS Paint: dán một ảnh khác, với màu phụ là trong suốt.Lớp phủ hình ảnh trong một hình ảnh

Example

+5

Chắc chắn khả thi. Đã hoàn thành [rất nhiều điều đó] (http://english.rejbrand.se/algosim/manual/pmproc/pmproc.html) bản thân mình. –

+1

@AndreasRejbrand: cảm ơn liên kết đó và cụ thể hơn là nội dung ở đó. Tham khảo tuyệt vời. –

Trả lời

9

Bạn có thể sử dụng tài sản của TransparentTBitmap về việc đó. Vì bitmap của bạn có đường viền màu đen, màu trong suốt tự động (pixel đầu tiên của dữ liệu hình ảnh) sẽ không hoạt động và bạn cũng cần đặt thuộc tính TransparentColor thành '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

Hoạt động hoàn hảo! Chỉ cần một lưu ý cho một người nào đó sử dụng mã này, hãy chắc chắn rằng bmp1 và bmp2 sẽ có cùng kích thước. Nếu bmp2 nhỏ hơn bmp1, thì bmp2 sẽ được đặt ở góc trên cùng bên trái của hình ảnh. –

3

Trong trường hợp của bitmap thứ hai là màu đen và trắng, bạn có thể sử dụng nó như một chiếc mặt nạ trong một hoạt động raster với BitBlt (chuyển bit-block), như sau:

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);