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

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

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

Ответить
Странник
незнакомец
Сообщения: 8
Зарегистрирован: 16.06.2010 18:36:02

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

Сообщение Странник »

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

Сообщение А.Н. »

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

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

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

Сообщение ViTality »

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

лучше так http://pogooglim.info/8dckl2tt.html
Последний раз редактировалось ViTality 18.06.2010 15:16:48, всего редактировалось 1 раз.
А.Н.
постоялец
Сообщения: 230
Зарегистрирован: 13.03.2010 11:23:58

Сообщение А.Н. »

:mrgreen: Ассортимент. Спасибо, я посмеялся.
Aleh
новенький
Сообщения: 53
Зарегистрирован: 08.08.2016 11:27:45

Сообщение Aleh »

Код: Выделить всё

//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 11:28:02, всего редактировалось 1 раз.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Если просто рисуешь на картинке векторное изображение TransparentColor не нужен . Вот когда копируешь( или рисуешь ) спрайт "прозрачный цвет" бывает действительно важен ...
Aleh
новенький
Сообщения: 53
Зарегистрирован: 08.08.2016 11:27:45

Сообщение Aleh »

Добрался до векторных....
мой "велосипед", "на ходу"

Код: Выделить всё

[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 11:27:45

Сообщение Aleh »

пробовал узнать "Для чего служат свойства 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 превращается в белый и становится "нестираемым артефактом" Больше всего похож на белую панель, передающую клики и давны компоненту, на котором лежит.

В общем очередное бесполезное свойство, а с учетом громкости названия - ВРЕДНОЕ.
ЖАЛЬ.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


А рамка (Border) вокруг изображения есть? Потому что у меня никаких черных рамок вокруг изображений нет и не было никогда.
Aleh
новенький
Сообщения: 53
Зарегистрирован: 08.08.2016 11:27:45

Сообщение Aleh »

Рамка (чаще белая или черная) есть там, где надо в прямоугольное изображение поместить непрямоугольный объект(трапецию).
Карта состоит из состыкованных трапеций, но перехлёстывающихся изображений (надеюсь понятно выразился).
Ответить