Прозрачность изображения

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Прозрачность изображения

Сообщение Странник » 18.06.2010 10:43:15

Всем привет.
Для чего служат свойства Bitmap.Transparent, Bitmap.TransparentColor, Bitmap.TransparentMode и как с ними работать? например можно сделать следующее: создать TBitmap, указать в нем прозрачный цвет. Нарисовать на нем что-нибудь с прозрачными участками, и наложить на другое изображение, чтобы при этом фон был виден через эти самые прозрачные участки. Если да то как?
Заранее благодарен.
Странник
незнакомец
 
Сообщения: 8
Зарегистрирован: 16.06.2010 18:36:02

Re: Прозрачность изображения

Сообщение А.Н. » 18.06.2010 12:33:33

Вообще, устанавливается Transparent. Когда картинка прорисовывается, прозрачные участки просто не рисуются.
Например, есть кнопки с картинками. Картинки на ярко-розовом фоне (цвет, который не используется).
При загрузке глифа, и установленном Transparent отрисовывается только картинка, но не фон.
Прозрачный цвет кнопка берёт то ли из левого верхнего, то ли из левого нижнего пиксела, не помню.
Правда, в lazarus нормально поддерживается PNG... А там есть прозрачность.

Нарисовать на нем что-нибудь с прозрачными участками, и наложить на другое изображение, чтобы при этом фон был виден через эти самые прозрачные участки. Если да то как?
Заранее благодарен.

Ну да, возможно. Установить TransparentColor. Canvas.Draw().
Если, не прокатит, то есть массив Canvas.Pixels (естественно, медленно).
Есть Canvas.Brush.Bitmap, Canvas.Brush.Style.
И есть, я так подозреваю, http://www.googleisyourfriend.com/ - delphi bitmap transparent .
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Прозрачность изображения

Сообщение ViTality » 18.06.2010 15:14:18

А.Н. писал(а):И есть, я так подозреваю, http://www.googleisyourfriend.com/ - delphi bitmap transparent .

лучше так http://pogooglim.info/8dckl2tt.html
Последний раз редактировалось ViTality 18.06.2010 15:16:48, всего редактировалось 1 раз.
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Re: Прозрачность изображения

Сообщение А.Н. » 18.06.2010 15:16:43

:mrgreen: Ассортимент. Спасибо, я посмеялся.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Прозрачность изображения

Сообщение Aleh » 13.09.2016 16:10:18

Код: Выделить всё
//Canvas - Канва потомка TCustomControl
//Rastr - TBitmap - растр pf1bit писан "черным по белому";
Canvas.Brush.Color:=clWhite;//цвет фона растра
Canvas.Rectangle(-9, -9, -10, -10);//применить Canvas.Brush.Color
Canvas.Font.Color:=clBlack;//установка цвета самого растра
Canvas.TextOut(-100, -100, '0');//применить Canvas.Font.Color
Rastr.TransparentColor:=clBlue;//никакой реакции
// Rastr.TransparentMode:=;//не эксперементировал
Canvas.CopyMode:=SRCAND;//способ отрисовки
//SRCCOPY - натуральная картинка
//SRCPAINT - прозрачно(исчезло) чёрное
//SRCAND - прозрачно(исчезло) белое - прозрачно черное(рисует как-бы снизу)
Canvas.CopyRect(r, Rastr.Canvas, rsours);//рисование

до полноцветных пока не добрался...
Последний раз редактировалось Aleh 16.09.2016 12:28:02, всего редактировалось 1 раз.
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Прозрачность изображения

Сообщение Alex2013 » 15.09.2016 11:34:54

Если просто рисуешь на картинке векторное изображение TransparentColor не нужен . Вот когда копируешь( или рисуешь ) спрайт "прозрачный цвет" бывает действительно важен ...
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44

Re: Прозрачность изображения

Сообщение Aleh » 19.01.2017 22:46:43

Добрался до векторных....
мой "велосипед", "на ходу"
Код: Выделить всё
[code]
// uses IntfGraphics;
procedure GlassDraw(Dest, Sours: TBitmap; percent: integer; TransParantColor:Tcolor=clWhite);
//"прозрачная" отрисовка картинки Sours по картинке Dest, 
//max(percent)=255-прозрачное(невидимое), 0-непрозрачное  TransParantColor-"невидимый" цвет
type
  TRGBTripleArray = array[0..32767] of TRGBTriple;
  PRGBTripleArray = ^TRGBTripleArray;
var x, y, i:integer;
    sr:TColor;
    R, G, B: Byte;
    k, k1:single;
    R1:TRect;
    Row1, Row2: PRGBTripleArray;
    ImgHandle, ImgMaskHandle: HBitmap;
    iDest, iSours: TLazIntfImage;
begin
if percent>255 then percent:=255;
if percent<0 then percent:=0;
k1:=percent/255;
k:=1-k1;
R1:=Rect(0,0,Sours.Width-1, Sours.Height-1);
iDest:= TLazIntfImage.Create(0,0);
iSours:= TLazIntfImage.Create(0,0);
iDest.LoadFromBitmap(Dest.Handle,Dest.MaskHandle);
// iDest.LoadFromDevice(Canvas.Handle .... не пробовал
iSours.LoadFromBitmap(Sours.Handle,Sours.MaskHandle);
for y:=0 to Sours.Height-1 do
  begin
    Row1 := iDest.GetDataLineStart(y); //like Delphi TBitMap.ScanLine
    Row2 := iSours.GetDataLineStart(y); //like Delphi TBitMap.ScanLine
    for x:=0 to Sours.Width-1 do
     begin
      r:=Row2^[x].rgbtRed;  g:=Row2^[x].rgbtGreen;  b:=Row2^[x].rgbtBlue;
      sr:=RGBToColor(r, g, b);
//      sr:=Sours.Canvas.Pixels[x,y];
      if sr=TransParantColor then continue;
//      conv.i32_1:=sr;
//      r:=conv.b8_1;    g:=conv.b8_2;    b:=conv.b8_3;//компоненты//    r:=Red(sr);    g:=Green(sr);    b:=Blue(sr);//компоненты
      //r:=trunc((255-r)*k)+r;    g:=trunc((255-g)*k)+g;    b:=trunc((255-b)*k)+b;//прозрачный аргис !!! правильно
      // i= k·Iб + (1-k)·Iд,
      //где 0 Ј k Ј 1 - характеризует прозрачность ближнего многоугольника. Если k = 1, то он непрозрачен.
      //Если же k = 0, то ближний многоугольник полностью прозрачен; Iб - интенсивность для пиксела ближнего многоугольника, Iд - дальнего.
      i:=trunc((r*k)+Row1^[x].rgbtRed*k1);    if i>$ff then i:=$ff else if i<0 then i:=0; r:=i;
      i:=trunc((g*k)+Row1^[x].rgbtGreen*k1);  if i>$ff then i:=$ff else if i<0 then i:=0; g:=i;
      i:=trunc((b*k)+Row1^[x].rgbtBlue*k1);   if i>$ff then i:=$ff else if i<0 then i:=0; b:=i;
      Row1^[x].rgbtRed:=R;
      Row1^[x].rgbtGreen:=g;
      Row1^[x].rgbtBlue:=b;//      dest.Canvas.Pixels[x,y]:=RGBToColor(r, g, b);
     end;
  end;
Dest.LoadFromIntfImage(iDest);
iDest.Free;
iSours.Free;
end;
[/code]


код вызова
var zBuf, Buf: TBitmap;
.............
for i:=0 to High(DrawLayers) do
begin
R:=Rect(0,0,FDrawParam.CanvasSize.x-1, FDrawParam.CanvasSize.y-1);
if zBuf.Height<>Height then zBuf.Height:=Height;
if zBuf.Width<>Width then zBuf.Width:=Width;
zBuf.Canvas.Pen.Width:=1;
zBuf.Canvas.Pen.Color:=TransParantColor;
zBuf.Canvas.Pen.Style:=psSolid;
zBuf.Canvas.Brush.Color:=TransParantColor;
zBuf.Canvas.Brush.Style:=bsSolid;
zBuf.Canvas.FillRect(R);
DrawLayers[i].Draw(zBuf.Canvas, @FDrawParam);
GlassDraw(buf, zBuf, DrawLayers[i].CanPar.Glass, TransParantColor);
end;
Canvas.Draw(0,0, buf);
..........................
Canvas- канва потомка TCustomControl
создаётся эффект прозрачности слоя как у аргиса, быстродействие приемлемое, память не ест, битмапы создаются 1 раз, при ресайзе компонента подгоняются их размеры. Создан на основе тутошнего примера.
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Прозрачность изображения

Сообщение Aleh » 25.01.2017 10:13:17

пробовал узнать "Для чего служат свойства Bitmap.Transparent, Bitmap.TransparentColor, Bitmap.TransparentMode и как с ними работать?"
задача: убрать переменную рамку черного цвета вокруг изображения Img1 и отрисовать его на Buf
Img1, Buf - ТBitmap или TPortableNetworkGraphic (результат одинаковый) установка свойств у Img1 на результат не влияет
код
Buf.TransparentColor:=clBlack;//должен также включить Buf.TransparentMode:=tmFixed;
Buf.TransparentMode:=tmFixed;//бережёного бог бережёт tmAuto, tmFixed
Buf.Transparent:=true;//в этот момент любой черный цвет на Buf превращается в белый и становится "нестираемым артефактом" Больше всего похож на белую панель, передающую клики и давны компоненту, на котором лежит.

В общем очередное бесполезное свойство, а с учетом громкости названия - ВРЕДНОЕ.
ЖАЛЬ.
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Прозрачность изображения

Сообщение Лекс Айрин » 25.01.2017 10:17:23

Aleh писал(а):задача: убрать переменную рамку черного цвета вокруг изображения Img1 и отрисовать его на Buf


А рамка (Border) вокруг изображения есть? Потому что у меня никаких черных рамок вокруг изображений нет и не было никогда.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Прозрачность изображения

Сообщение Aleh » 25.01.2017 12:35:42

Рамка (чаще белая или черная) есть там, где надо в прямоугольное изображение поместить непрямоугольный объект(трапецию).
Карта состоит из состыкованных трапеций, но перехлёстывающихся изображений (надеюсь понятно выразился).
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 26

Рейтинг@Mail.ru