![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прозрачность на TImage
Denis__ © (2009-02-21 19:27:00)Хай, о всемогущий ALL! У меня такая проблема: Имеется
Img : TImage; bmp : TBitmap;
Img.Transparent := True;
В bmp загружена картинка такая что на ней есть области "прозрачности". Т.е. совпадающие по цвету с пикселом (0,0).
Далее
BitBlt(
Img.Canvas.Handle, 0, 0, bmp.Width, bmp.Height,
bmp.Canvas.Handle, 0, 0, SRCCOPY);
Img.Repaint;
потом я меняю картинку в bmp на другую, где области "прозрачности" частично перекрыты. и снова
BitBlt(
Img.Canvas.Handle, 0, 0, bmp.Width, bmp.Height,
bmp.Canvas.Handle, 0, 0, SRCCOPY);
Img.Repaint;
Те места, где было непрозрачно отрисовываются нормально. А вот те где было прозрачно - нет. Т.е там опять прозрачно.
Если сделать так
Img.Transparent := False;
BitBlt(
Img.Canvas.Handle, 0, 0, bmp.Width, bmp.Height,
bmp.Canvas.Handle, 0, 0, SRCCOPY);
Img.Repaint;
Img.Transparent := True;
Перерисовываются и те места где было прозрачно, но появляется неприятное мерцание. Вопрос - что делать? и как быть?:(
Denis__ (2009-02-22 19:34:00) [1]Сделал так:
1)Копирование куска фона на битмап BItBlt()
2)Копирование на этот же битмап др. битмапа, с прозрачностью TransparentBlt()
3)1-2 для второго битмапа
4)Собсно все)
Еще раз спасибо, {RASkov},CodeMaster
{RASkov} (2009-02-22 11:51:00) [2]> [6] Denis__ © (22.02.09 11:23)
При обращении к канвасу TImage создает Graphic(т.н. Bitmap), если его не было...
Т.е. тебе может помочь img.Picture:=nil.... но это видимо не быстрый способ. Если скорость не важна, то....
можно наверное вместо очистки отрисовать первый битмап без прозрачности.... или отрисовать фон(то, на чем лежит Img - например серая форма, тогда... собсно вот эти способы:
procedure TForm1.Button1Click(Sender: TObject);
begin
//Рисуем на канве TImage
Image1.Canvas.Rectangle(10, 10, 50, 50);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//"Стираем раз"
Image1.Picture:=nil;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
//"Стираем два"
Image1.Canvas.Brush.Color:=Color;
Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
end;
или
procedure TForm1.Button4Click(Sender: TObject);
begin
Image2.Hide;
Application.ProcessMessages;
Image2.Canvas.CopyRect(Image2.Canvas.ClipRect, Canvas, Image2.BoundsRect);
Image2.Show;
end;
Вообщем это не конечные варианты, т.е. можно и еще придумать, но зависит от конкретных целей(задач)....
Denis__ (2009-02-22 11:23:00) [3]Сейчас все так: Есть Img : TImage;. Transparent = False;
Img изначально "пустой" - т.е. в нем ничего не нарисовано
Рисуется Битмап с прозрачностью:
tr := GetPixel(bmp.Canvas.Handle, 0, 0);
TransparentBlt(
Img.Canvas.Handle, 0, 0, bmp.Width,bmp.Height,
bmp.Canvas.Handle, 0, 0, bmp.Width,bmp.Height,tr);
затем рисуется второй Битмап, где тоже есть прозрачность, но та - первая прозрачность частично перекрыта.
tr := GetPixel(bmp1.Canvas.Handle, 0, 0);
TransparentBlt(
Img.Canvas.Handle, 0, 0, bmp1.Width,bmp1.Height,
bmp.Canvas.Handle, 0, 0, bmp1.Width,bmp1.Height,tr);
а потом надо опять нарисовать bmp.
как привести Image к первоначальному - "пустому" состоянию?
{RASkov} (2009-02-21 23:59:00) [4]> [4] Denis__ © (21.02.09 21:40)
> как полностью очистить img.Picture.Bitmap?
Что значит очистить? Залить(FillRect) каким либо одним цветом? "Убить"(Free)(или img.Picture:=nil) битмап? или что?
Denis__ (2009-02-21 21:40:00) [5]Спасибо, работает. А не подскажите, как полностью очистить img.Picture.Bitmap? а то потом надо опять сделать прозрачными те области, где сейчас закрашено.
Denis__ (2009-02-21 21:05:00) [6]
> Б (21.02.09 20:30) [2]
> > но появляется неприятное мерцание. DoubleBuffered:= 3
> = 3;
не надо стеба.
> CodeMaster © (21.02.09 20:06) [1]
> TransparentBlt
Спасибо, сейчас буду пробовать.
Б (2009-02-21 20:30:00) [7]> но появляется неприятное мерцание.
DoubleBuffered:= 3 = 3;
CodeMaster (2009-02-21 20:06:00) [8]TransparentBlt