Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как быстро(!) рисовать текст на битмапку с учетом альфа канала? / 25 сообщений из 55, страница 1 из 3
21.08.2018, 19:59
    #39691287
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
Пользуюсь Graphics32 - оно не умеет.
Подпорки ставить можно - но будет медленно.

Есть идеи?
...
Рейтинг: 0 / 0
21.08.2018, 20:12
    #39691296
под ван
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
Всегда делал это через
Код: pascal
1.
Assign

- моментом делалось даже когда счёт шёл на тысячи.
...
Рейтинг: 0 / 0
21.08.2018, 20:16
    #39691297
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
под ван,

assign чего куда?
...
Рейтинг: 0 / 0
21.08.2018, 22:09
    #39691351
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
rgreatПользуюсь Graphics32 - оно не умеет.
Подпорки ставить можно - но будет медленно.

Есть идеи?
чо ты трындишь, если бибиотека G32 заточена именно под 32 бита ?
всегда там текст выводился с альфа-каналом, там даже демки есть
а не рукожоп ли ты ?
...
Рейтинг: 0 / 0
21.08.2018, 22:53
    #39691373
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
rgreat,

текст не любит альфу, клеартайпу нужно знать что там вокруг
...
Рейтинг: 0 / 0
21.08.2018, 23:09
    #39691374
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
defecatorчо ты трындишь, если бибиотека G32 заточена именно под 32 бита ?
всегда там текст выводился с альфа-каналом, там даже демки есть
а не рукожоп ли ты ?Если ты не в теме, не значит что остальные не в теме.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TBitmap32.Textout(X, Y: Integer; const Text: String);
begin
  (FBackend as ITextSupport).Textout(X, Y, Text);
end;

procedure TGDIBackend.Textout(X, Y: Integer; const Text: String);
var
  Extent: TSize;
begin
  UpdateFont;

  if not FOwner.MeasuringMode then
  begin
    if FOwner.Clipping then
      ExtTextout(Handle, X, Y, ETO_CLIPPED, @FOwner.ClipRect, PChar(Text), Length(Text), nil)
    else
      ExtTextout(Handle, X, Y, 0, nil, PChar(Text), Length(Text), nil);
  end;

  Extent := TextExtent(Text);
  FOwner.Changed(MakeRect(X, Y, X + Extent.cx + 1, Y + Extent.cy + 1));
end;


ExtTextout - это простой GDI.
Альфаканал оно не умеет.
...
Рейтинг: 0 / 0
21.08.2018, 23:10
    #39691375
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
На 32 битную битмапку GDI текст выводит, но альфаканал при этом забивает мусором.
...
Рейтинг: 0 / 0
21.08.2018, 23:19
    #39691376
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
rgreat,

а что ты собственно хочешь видеть в альфе при выводе текста?
...
Рейтинг: 0 / 0
21.08.2018, 23:24
    #39691380
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
asviridenkov,

У меня сгенеренные png-шки с текстом которые я вывожу поверх jpg-ов на веб-страничке.

Хочу чтобы антиалиасинг по краям текста в png гармонично смотрелся на общей картине.
...
Рейтинг: 0 / 0
21.08.2018, 23:26
    #39691382
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
Есть вариант рендерить текст на отдельный битмап с равномерным фоном, а потом рендерить его на главный, получая альфу с помощью простой математики, но это медленно.
...
Рейтинг: 0 / 0
21.08.2018, 23:33
    #39691384
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
Ну и до кучи еще альфа от антиалисинга текста при рендере должна склеиваться с цветами и альфой уже существующими на растре png-шки от рисования других полупрозрачных и сглаженных примитивов не ней.
...
Рейтинг: 0 / 0
21.08.2018, 23:42
    #39691388
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
rgreat,

а, ну понятно, я уже проходил. У меня ничего не вышло, нужно рисовать именно по тому фону где будет в итоге, попытки рисовать по прозрачному и накладывать ведут к корявому тексту, чем не рисуй - DirectX, GDI, GDI+
...
Рейтинг: 0 / 0
21.08.2018, 23:59
    #39691399
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
С обычной графикой-то выходит, тогда почему не может выйти с текстом?

Главная проблема - найти быструю библиотеку для рендера текста.

Например вот так - все ок. Но медленно.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TCanvasEx.TextOutEx(X, Y: Integer; const Text: string);
var
  Intf: ITextToPathSupport;
  Path: TFlattenedPath;
begin
  Path := TFlattenedPath.Create;
  try
    if Supports(FG32.Backend, ITextToPathSupport, Intf) then
    begin
      Intf.TextToPath(Path,X,Y,Text);
      PolyPolygonFS(FG32,Path.Path, Font.Color32);
    end;
  finally
    Path.Free;
  end;
end;
...
Рейтинг: 0 / 0
22.08.2018, 00:15
    #39691402
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
rgreat,

глифы сделай, быстрее и качественнее не будет

с метриками текста повозиться правда придётся
...
Рейтинг: 0 / 0
22.08.2018, 00:17
    #39691403
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
kealon(Ruslan)с метриками текста повозиться правда придётсяЭто и пугает.
...
Рейтинг: 0 / 0
22.08.2018, 00:19
    #39691405
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
Да и некоторые сомнения у меня в том рендер туевой хучи битмапок-букв - это быстро.
...
Рейтинг: 0 / 0
22.08.2018, 00:43
    #39691410
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
rgreat,

cleartype он многоцветный, а с path максимум антиалисинг будет
...
Рейтинг: 0 / 0
22.08.2018, 01:54
    #39691422
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
Мне в целом и приличного антиалиасинга бы хватило.
...
Рейтинг: 0 / 0
22.08.2018, 09:01
    #39691454
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
rgreatdefecatorчо ты трындишь, если бибиотека G32 заточена именно под 32 бита ?
всегда там текст выводился с альфа-каналом, там даже демки есть
а не рукожоп ли ты ?Если ты не в теме, не значит что остальные не в теме.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TBitmap32.Textout(X, Y: Integer; const Text: String);
begin
  (FBackend as ITextSupport).Textout(X, Y, Text);
end;

procedure TGDIBackend.Textout(X, Y: Integer; const Text: String);
var
  Extent: TSize;
begin
  UpdateFont;

  if not FOwner.MeasuringMode then
  begin
    if FOwner.Clipping then
      ExtTextout(Handle, X, Y, ETO_CLIPPED, @FOwner.ClipRect, PChar(Text), Length(Text), nil)
    else
      ExtTextout(Handle, X, Y, 0, nil, PChar(Text), Length(Text), nil);
  end;

  Extent := TextExtent(Text);
  FOwner.Changed(MakeRect(X, Y, X + Extent.cx + 1, Y + Extent.cy + 1));
end;



ExtTextout - это простой GDI.
Альфаканал оно не умеет.

Родная демка RenderText_Ex с тобой несогласна
...
Рейтинг: 0 / 0
22.08.2018, 09:04
    #39691456
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
Найди здесь то, что ты написал выше
Не знаю, куда ты смотришь

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
procedure TBitmap32.RenderText(X, Y: Integer; const Text: string; AALevel: Integer; Color: TColor32);
var
  B, B2: TBitmap32;
  Sz: TSize;
  C, Alpha: TColor32;
  I: Integer;
  P: PColor32;
  StockCanvas: TCanvas;

  procedure ScaleDown(N: Integer); // use only the blue channel
  var
    I, J, X, Y, P, Q, Sz, S: Integer;
    Src: PColor32;
    Dst: PColor32;
  begin
    Sz := 1 shl N - 1;
    Dst := B.PixelPtr[0, 0];
    for J := 0 to B.Height - 1 do
    begin
      Y := J shl N;
      for I := 0 to B.Width - 1 do
      begin
        X := I shl N;
        S := 0;
        for Q := Y to Y + Sz do
        begin
          Src := B2.PixelPtr[X, Q];
          for P := X to X + Sz do
          begin
            S := S + Integer(Src^ and $000000FF);
            Inc(Src);
          end;
        end;
        S := S shr N shr N;
        Dst^ := TColor32(S shl 24) + Color;
        Inc(Dst);
      end;
    end;
  end;

begin
  if Empty then Exit;

  Alpha := Color shr 24;
  Color := Color and $00FFFFFF;
  AALevel := Constrain(AALevel, 0, 4);

  B := TBitmap32.Create;
  try
    if AALevel = 0 then
    begin
      Sz := TextExtent(Text + ' ');
      B.SetSize(Sz.cX, Sz.cY);
      B.Font := Font;
      B.Clear(0);
      B.Font.Color := clWhite;
      B.Textout(0, 0, Text);

      // convert blue channel to alpha and fill the color
      P := @B.Bits[0];
      for I := 0 to B.Width * B.Height - 1 do
      begin
        C := P^;
        if C <> 0 then
        begin
          C := P^ shl 24; // transfer blue channel to alpha
          C := C + Color;
          P^ := C;
        end;
        Inc(P);
      end;
    end
    else
    begin
      StockCanvas := StockBitmap.Canvas;
      StockCanvas.Lock;
      try
        StockCanvas.Font := Font;
        StockCanvas.Font.Size := Font.Size shl AALevel;
        Sz := StockCanvas.TextExtent(Text + ' ');
        Sz.Cx := (Sz.cx shr AALevel + 1) shl AALevel;
        B2 := TBitmap32.Create;
        try
          B2.SetSize(Sz.Cx, Sz.Cy);
          B2.Clear(0);
          B2.Font := StockCanvas.Font;
          B2.Font.Color := clWhite;
          B2.Textout(0, 0, Text);
          B2.StretchFilter := sfLinear;
          B.SetSize(Sz.cx shr AALevel, Sz.cy shr AALevel);
          ScaleDown(AALevel);
        finally
          B2.Free;
        end;
      finally
        StockCanvas.Unlock;
      end;
    end;

    B.DrawMode := dmBlend;
    B.MasterAlpha := Alpha;

    B.DrawTo(Self, X, Y);
  finally
    B.Free;
  end;
end;

...
Рейтинг: 0 / 0
22.08.2018, 09:20
    #39691464
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
rgreatДа и некоторые сомнения у меня в том рендер туевой хучи битмапок-букв - это быстро.это чудовищно быстро по сравнеию с любой векторной растеризацией

про ClearType конечно придётся забыть, только антиалиасинг
...
Рейтинг: 0 / 0
22.08.2018, 11:32
    #39691591
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
defecator,

Какие буквы в слове "быстро" тебе не понятны?
...
Рейтинг: 0 / 0
22.08.2018, 11:39
    #39691599
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
defecatorНайди здесь то, что ты написал выше
Не знаю, куда ты смотришь

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TBitmap32.RenderText(X, Y: Integer; const Text: string; AALevel: Integer; Color: TColor32);
<..>
  B := TBitmap32.Create;
  try
    if AALevel = 0 then
    begin
      Sz := TextExtent(Text + ' ');
      B.SetSize(Sz.cX, Sz.cY);
      B.Font := Font;
      B.Clear(0);
      B.Font.Color := clWhite;
      B.Textout(0, 0, Text);  // Это по твоему что?

      // convert blue channel to alpha and fill the color
      P := @B.Bits[0];
      for I := 0 to B.Width * B.Height - 1 do
      begin
        C := P^;
<..>
...
Рейтинг: 0 / 0
22.08.2018, 11:49
    #39691613
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
kealon(Ruslan)это чудовищно быстро по сравнеию с любой векторной растеризацией
Мда? А мне практика показывала иное.
В винде шрифтовый движек просто ну ОЧЕНЬ быстр. Поднимаю шляпу перед создателями.
...
Рейтинг: 0 / 0
22.08.2018, 12:02
    #39691631
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
rgreatdefecatorНайди здесь то, что ты написал выше
Не знаю, куда ты смотришь

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TBitmap32.RenderText(X, Y: Integer; const Text: string; AALevel: Integer; Color: TColor32);
<..>
  B := TBitmap32.Create;
  try
    if AALevel = 0 then
    begin
      Sz := TextExtent(Text + ' ');
      B.SetSize(Sz.cX, Sz.cY);
      B.Font := Font;
      B.Clear(0);
      B.Font.Color := clWhite;
      B.Textout(0, 0, Text);  // Это по твоему что?

      // convert blue channel to alpha and fill the color
      P := @B.Bits[0];
      for I := 0 to B.Width * B.Height - 1 do
      begin
        C := P^;
<..>


if AALevel = 0 then
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как быстро(!) рисовать текст на битмапку с учетом альфа канала? / 25 сообщений из 55, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]