![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте!
Нужно вывести на TPNGObject произвольный текст, и, естественно, с прозрачным фоном. Если выводить через "TPNGObject.Canvas.TextOut(**)", то текст рисуется на непрозрачной границе изображения, да и ещё с серым фоном. Прошу помощи. Заранее, спасибо! |
#2
|
||||
|
||||
![]() TPNGObject.Canvas.Brush.Style := bsClear
Должно помочь. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
![]() angvelem, это не то.
Нужно как-бы применить альфа-канал к шрифту (Arial, 12). Т.е., к примеру, у нас нарисована окружность на TPNGObject с альфа-каналом, то, что в окр. будет видно, а вне - не видно. ЗЫ: С серым фоном разобрался через SetBkMode. Последний раз редактировалось Radical, 18.04.2012 в 19:23. |
#4
|
||||
|
||||
![]() Не уверен, но стандартными способами это невозможно. Кажись. Где текста не видно, значение Alpha пикселей равно 0 (абсолютно прозрачный?), соответственно, цвет невидимый. Можно, конечно, разработать свои, "свихнутые" методы (не напрямую выводить текст в Canvas, а в буфферную картинку, потом через ScanLines в обьект например), но они помедленее будут. Наверное.
|
#5
|
|||
|
|||
![]() Абсолютно верно - "Где текста не видно, значение Alpha пикселей равно 0".
Может как-нибудь через TBitmap попробовать? Любые методы приму ![]() |
#6
|
||||
|
||||
![]() Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
![]() Ладно, скажу проще:
Допустим: имеем TPNGObject, он полностью прозрачен. Задача: вывести текст с поддержкой прозрачности. К примеру мы открыли Paint.NET/Photoshop очистили всё изображение, написали на нём текст и сохранили в PNG. |
#8
|
||||
|
||||
![]() Ну сам же сказал, что функцией SetBkMode воспользовался. Она и выставляет прозрачно или нет.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#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 ... |