Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.12;
Скачать: CL | DM;

Вниз

Прозрачность на 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
15-1234454770
Kerk
2009-02-12 19:06
2009.04.12
Долгосрочный научно-технологический прогноз Российской Федерации


11-1199562367
Willower
2008-01-05 22:46
2009.04.12
Incompatible types: TKOLApplet and PControl


2-1235471812
nstur
2009-02-24 13:36
2009.04.12
PageSetup


2-1235559158
Footballer
2009-02-25 13:52
2009.04.12
Отправка e-mail


15-1234441002
begin...end
2009-02-12 15:16
2009.04.12
Непятничная задачка для начинающих :)