Мастерская Delphi программирования. | |||||||||||||||
| |||||||||||||||
Рисуем прозрачную картинку.
пример: trbmp.zip Иногда возникает ситуация когда, необходимо сделать рисунок прозрачным, то есть удалить его фон. Сталкнувшись с такой проблемой, пришлось немного покопать MSDN. В результате получилась тестовая программа, которая использует несколько способов добиться желаемого результата.
Рассмотрим подробнее способы решения задачи. Способ MSDN.
var bm: Windows.TBitmap; hDcTemp: HDC; ptSize: TPoint; hDcBack, hDcObject, hDcMem, hDcSave: hDc; bmAndBack, bmAndObject, bmAndMem, bmSave: HBitmap; bmBackOld, bmObjectOld, bmMemOld, bmSaveOld: HBitmap; sColor: TColorRef; begin hDcTemp := CreateCompatibleDc(Dc); SelectObject(hDcTemp,Bitmap); GetObject(Bitmap,Sizeof(bm),@bm); ptSize.x := bm.bmWidth; ptSize.y := bm.bmHeight; hDcBack := CreateCompatibleDc(Dc); hDcObject := CreateCompatibleDc(Dc); hDcMem := CreateCompatibleDc(Dc); hDcSave := CreateCompatibleDc(Dc); bmAndBack := CreateBitmap(ptSize.x,ptSize.y,1,1,nil); bmAndObject := CreateBitmap(ptSize.x,ptSize.y,1,1,nil); bmAndMem := CreateCompatibleBitmap(Dc,ptSize.x,ptSize.y); bmSave := CreateCompatibleBitmap(Dc,ptSize.x,ptSize.y); bmBackOld := SelectObject(hDcBack,bmAndBack); bmObjectOld := SelectObject(hDcObject,bmAndObject); bmMemOld := SelectObject(hDcMem,bmAndMem); bmSaveOld := SelectObject(hDcSave,bmSave); SetMapMode(hDcTemp,GetMapMode(Dc)); BitBlt(HDcSave,0,0,ptSize.x,ptSize.y,HDcTemp,0,0,SRCCOPY); sColor := SetBkColor(hDcTemp,trColor); BitBlt(hDcObject,0,0,ptSize.x,ptSize.y,hDcTemp,0,0,SRCCOPY); SetBkColor(hDcTemp,sColor); BitBlt(hDcBack,0,0,ptSize.x,ptSize.y,hDcObject,0,0,NOTSRCCOPY); BitBlt(hDcMem,0,0,ptSize.x,ptSize.y,Dc,xStart,yStart,SRCCOPY); BitBlt(hDcMem,0,0,ptSize.x,ptSize.y,hDcObject,0,0,SRCAND); BitBlt(hDcTemp,0,0,ptSize.x,ptSize.y,hDcBack,0,0,SRCAND); BitBlt(hDcMem,0,0,ptSize.x,ptSize.y,hDcTemp,0,0,SRCPAINT); BitBlt(Dc,xStart,yStart,ptSize.x,ptSize.y,hDcMem,0,0,SRCCOPY); BitBlt(hDcTemp,0,0,ptSize.x,ptSize.y,hDcSave,0,0,SRCCopy); DeleteObject(SelectObject(hDcBack,bmBackOld)); DeleteObject(SelectObject(hDcObject,bmObjectOld)); DeleteObject(SelectObject(hDcMem,bmMemOld)); DeleteObject(SelectObject(hDcSave,bmSaveOld)); DeleteDc(hDcBack); DeleteDc(hDcObject); DeleteDc(hDcMem); DeleteDc(hDcSave); DeleteDc(hDcTemp); end; Здесь создается Маска. Накладывается на картинку. В результате фон удаляется. Думаю тоже самое делается в способе Win98, только он скрыт от нас внутри системы. Способ Win98 Существует еще два способа сделать рисунок прозрачным, которые не использованы в тестовой программе. пример: trbmp.zip | |||||||||||||||
| |||||||||||||||
http://www.valler.narod.ru |