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
Trả lời
Bạn có thể sử dụng tài sản của Transparent
TBitmap
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);
..
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. –
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);
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. –
@AndreasRejbrand: cảm ơn liên kết đó và cụ thể hơn là nội dung ở đó. Tham khảo tuyệt vời. –