![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
Нужно вывести на TPNGObject произвольный текст, и, естественно, с прозрачным фоном. Если выводить через "TPNGObject.Canvas.TextOut(**)", то текст рисуется на непрозрачной границе изображения, да и ещё с серым фоном. Прошу помощи. Заранее, спасибо! |
|
#2
|
||||
|
||||
|
TPNGObject.Canvas.Brush.Style := bsClear
Должно помочь. |
|
#3
|
|||
|
|||
|
angvelem, это не то.
Нужно как-бы применить альфа-канал к шрифту (Arial, 12). Т.е., к примеру, у нас нарисована окружность на TPNGObject с альфа-каналом, то, что в окр. будет видно, а вне - не видно. ЗЫ: С серым фоном разобрался через SetBkMode. Последний раз редактировалось Radical, 18.04.2012 в 19:23. |
|
#4
|
||||
|
||||
|
Не уверен, но стандартными способами это невозможно. Кажись. Где текста не видно, значение Alpha пикселей равно 0 (абсолютно прозрачный?), соответственно, цвет невидимый. Можно, конечно, разработать свои, "свихнутые" методы (не напрямую выводить текст в Canvas, а в буфферную картинку, потом через ScanLines в обьект например), но они помедленее будут. Наверное.
|
|
#5
|
|||
|
|||
|
Абсолютно верно - "Где текста не видно, значение Alpha пикселей равно 0".
Может как-нибудь через TBitmap попробовать? Любые методы приму ![]() |
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
|||
|
|||
|
Ладно, скажу проще:
Допустим: имеем TPNGObject, он полностью прозрачен. Задача: вывести текст с поддержкой прозрачности. К примеру мы открыли Paint.NET/Photoshop очистили всё изображение, написали на нём текст и сохранили в PNG. |
|
#8
|
||||
|
||||
|
Ну сам же сказал, что функцией SetBkMode воспользовался. Она и выставляет прозрачно или нет.
|
|
#9
|
||||
|
||||
|
Ну, кто хочет посмотреть на мое "творчество"?
Но код работает, пробовал!!! Оптимизируйте и исправляйте на здоровье!!! Код:
procedure TextOut(var Obj:TPngObject;const Color, bkColor:TColor; const X,Y, size:Integer; const text:String; const bkTransparent:boolean=false);//вывод текста
var
bmp:TPNGObject;
RowBmp, Row: pRGBLine;
aSL, aSL1: PByteArray;
i,j, t,b,l,r,h, i1,j1:integer;
pcl:TColor;
begin
bmp:=TPNGObject.CreateBlank(COLOR_RGB,16,10,10);
bmp.Canvas.Font.Size:=size;
bmp.Canvas.Font.Color:=Color;
bmp.Canvas.Brush.Style:=bsSolid;
bmp.Canvas.Brush.Color:=bkColor;
l:=bmp.Canvas.TextWidth(text);
h:=bmp.Canvas.TextHeight(text);
bmp.Resize(l,h);
bmp.CreateAlpha;
bmp.Canvas.TextOut(0,0,text);
t:=Y; if (t<0) then t:=0; if (t>=obj.Height) then t:=obj.Height;
b:=Y+bmp.Height; if (b<0) then b:=0; if (b>=obj.Height) then b:=obj.Height;
l:=X; if (l<0) then l:=0; if (l>=obj.Width) then l:=obj.Width;
r:=X+bmp.Width; if (r<0) then r:=0; if (r>=obj.Width) then r:=obj.Width;
i1:=0;
for i:=t to b-1 do begin
RowBmp:=bmp.ScanLine[i1];
Row:=Obj.Scanline[i];
aSL1 := bmp.AlphaScanline[i1];
aSL := Obj.AlphaScanline[i];
j1:=0;
for j:=l to r-1 do begin
pcl:=RGB(RowBmp[j1].rgbtRed,RowBmp[j1].rgbtGreen,RowBmp[j1].rgbtBlue);
if (pcl=Color) or (not bkTransparent) then begin
row[j].rgbtBlue:=RowBmp[j1].rgbtBlue;
row[j].rgbtGreen:=RowBmp[j1].rgbtGreen;
row[j].rgbtRed:=RowBmp[j1].rgbtRed;
aSL[j]:=255;
end;
inc(j1);
end;
inc(i1);
end;
bmp.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
var img:TBitMap;
l,h:Integer;
begin
TextOut(pngObject,clRed,clYellow,0,0,12,'textj_YЪ,"',true);
end; |
| Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение: | ||
Radical (19.04.2012)
| ||
|
#10
|
|||
|
|||
|
YVitaliy, попробовал - ничего не получается. Вместо изображения выводится белая линия.
Но, суть я понял - путь верный, только вот ещё совсем не прямой) |
|
#11
|
||||
|
||||
|
Как я обычно практикую - аттач... Мож у меня TPNG не тот:
- все модули в аттаче, компонент я не ставил. |
| Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение: | ||
Radical (19.04.2012)
| ||
|
#12
|
|||
|
|||
|
|
|
#13
|
|||
|
|||
|
YVitaliy, да, и вправду работает!
Но, вот одна загвоздка, из-за которой, как раз, я сюда и обратился - в твоей функции шрифт "MS Sans Serif", который выводится, как бы без антилайзинга (не знаю как ещё назвать), т.е. только красные пиксели, т.е. шрифт получается не красивый. А мне нужно использовать шрифт Arial. Но всё-равно, спасибо тебе за помощь! ![]() |
|
#14
|
||||
|
||||
|
Если нужно сглаживание можешь при рисовании "пропускать" цвет фона, тогда остальные цвета будут рисоваться:
Код:
if ((pcl<>bkColor) and (bkTransparent)) or (not bkTransparent) then begin ... |