Форум: "Начинающим";
Текущий архив: 2009.04.12;
Скачать: [xml.tar.bz2];
ВнизПрозрачность на TImage Найти похожие ветки
← →
Denis__ © (2009-02-21 19:27) [0]Хай, о всемогущий 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;
Перерисовываются и те места где было прозрачно, но появляется неприятное мерцание. Вопрос - что делать? и как быть?:(
← →
CodeMaster © (2009-02-21 20:06) [1]TransparentBlt
← →
Б (2009-02-21 20:30) [2]> но появляется неприятное мерцание.
DoubleBuffered:= 3 = 3;
← →
Denis__ © (2009-02-21 21:05) [3]
> Б (21.02.09 20:30) [2]
> > но появляется неприятное мерцание. DoubleBuffered:= 3
> = 3;
не надо стеба.
> CodeMaster © (21.02.09 20:06) [1]
> TransparentBlt
Спасибо, сейчас буду пробовать.
← →
Denis__ © (2009-02-21 21:40) [4]Спасибо, работает. А не подскажите, как полностью очистить img.Picture.Bitmap? а то потом надо опять сделать прозрачными те области, где сейчас закрашено.
← →
{RASkov} © (2009-02-21 23:59) [5]> [4] Denis__ © (21.02.09 21:40)
> как полностью очистить img.Picture.Bitmap?
Что значит очистить? Залить(FillRect) каким либо одним цветом? "Убить"(Free)(или img.Picture:=nil) битмап? или что?
← →
Denis__ © (2009-02-22 11:23) [6]Сейчас все так: Есть 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-22 11:51) [7]> [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 19:34) [8]Сделал так:
1)Копирование куска фона на битмап BItBlt()
2)Копирование на этот же битмап др. битмапа, с прозрачностью TransparentBlt()
3)1-2 для второго битмапа
4)Собсно все)
Еще раз спасибо, {RASkov},CodeMaster
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.04.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c