Прозрачность изображения
Модератор: Модераторы
Прозрачность изображения
Всем привет.
Для чего служат свойства Bitmap.Transparent, Bitmap.TransparentColor, Bitmap.TransparentMode и как с ними работать? например можно сделать следующее: создать TBitmap, указать в нем прозрачный цвет. Нарисовать на нем что-нибудь с прозрачными участками, и наложить на другое изображение, чтобы при этом фон был виден через эти самые прозрачные участки. Если да то как?
Заранее благодарен.
Для чего служат свойства Bitmap.Transparent, Bitmap.TransparentColor, Bitmap.TransparentMode и как с ними работать? например можно сделать следующее: создать TBitmap, указать в нем прозрачный цвет. Нарисовать на нем что-нибудь с прозрачными участками, и наложить на другое изображение, чтобы при этом фон был виден через эти самые прозрачные участки. Если да то как?
Заранее благодарен.
Вообще, устанавливается Transparent. Когда картинка прорисовывается, прозрачные участки просто не рисуются.
Например, есть кнопки с картинками. Картинки на ярко-розовом фоне (цвет, который не используется).
При загрузке глифа, и установленном Transparent отрисовывается только картинка, но не фон.
Прозрачный цвет кнопка берёт то ли из левого верхнего, то ли из левого нижнего пиксела, не помню.
Правда, в lazarus нормально поддерживается PNG... А там есть прозрачность.
Ну да, возможно. Установить TransparentColor. Canvas.Draw().
Если, не прокатит, то есть массив Canvas.Pixels (естественно, медленно).
Есть Canvas.Brush.Bitmap, Canvas.Brush.Style.
И есть, я так подозреваю, http://www.googleisyourfriend.com/ - delphi bitmap transparent .
Например, есть кнопки с картинками. Картинки на ярко-розовом фоне (цвет, который не используется).
При загрузке глифа, и установленном Transparent отрисовывается только картинка, но не фон.
Прозрачный цвет кнопка берёт то ли из левого верхнего, то ли из левого нижнего пиксела, не помню.
Правда, в lazarus нормально поддерживается PNG... А там есть прозрачность.
Нарисовать на нем что-нибудь с прозрачными участками, и наложить на другое изображение, чтобы при этом фон был виден через эти самые прозрачные участки. Если да то как?
Заранее благодарен.
Ну да, возможно. Установить TransparentColor. Canvas.Draw().
Если, не прокатит, то есть массив Canvas.Pixels (естественно, медленно).
Есть Canvas.Brush.Bitmap, Canvas.Brush.Style.
И есть, я так подозреваю, http://www.googleisyourfriend.com/ - delphi bitmap transparent .
А.Н. писал(а):И есть, я так подозреваю, http://www.googleisyourfriend.com/ - delphi bitmap transparent .
лучше так http://pogooglim.info/8dckl2tt.html
Последний раз редактировалось ViTality 18.06.2010 15:16:48, всего редактировалось 1 раз.
Код: Выделить всё
//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 раз.
Если просто рисуешь на картинке векторное изображение TransparentColor не нужен . Вот когда копируешь( или рисуешь ) спрайт "прозрачный цвет" бывает действительно важен ...
Добрался до векторных....
мой "велосипед", "на ходу"
код вызова
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 раз, при ресайзе компонента подгоняются их размеры. Создан на основе тутошнего примера.
мой "велосипед", "на ходу"
Код: Выделить всё
[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 раз, при ресайзе компонента подгоняются их размеры. Создан на основе тутошнего примера.
пробовал узнать "Для чего служат свойства 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 превращается в белый и становится "нестираемым артефактом" Больше всего похож на белую панель, передающую клики и давны компоненту, на котором лежит.
В общем очередное бесполезное свойство, а с учетом громкости названия - ВРЕДНОЕ.
ЖАЛЬ.
задача: убрать переменную рамку черного цвета вокруг изображения 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) вокруг изображения есть? Потому что у меня никаких черных рамок вокруг изображений нет и не было никогда.
Рамка (чаще белая или черная) есть там, где надо в прямоугольное изображение поместить непрямоугольный объект(трапецию).
Карта состоит из состыкованных трапеций, но перехлёстывающихся изображений (надеюсь понятно выразился).
Карта состоит из состыкованных трапеций, но перехлёстывающихся изображений (надеюсь понятно выразился).
