Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.46 MB
Время: 0.006 c
15-1234515144
Юрий Зотов
2009-02-13 11:52
2009.04.12
Черная пятница


15-1234330396
Василий Жогарев
2009-02-11 08:33
2009.04.12
Счетчики электрической энерии "Меркурий".


15-1234183264
OlegNik
2009-02-09 15:41
2009.04.12
Как узнать сколько ВЗУ (флешек) в компе?


2-1235165863
Mops
2009-02-21 00:37
2009.04.12
TWebBrowser


15-1234187406
321
2009-02-09 16:50
2009.04.12
Докеры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский