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

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

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

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

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

текст не любит альфу, клеартайпу нужно знать что там вокруг
...
Рейтинг: 0 / 0
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #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
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #39691375
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На 32 битную битмапку GDI текст выводит, но альфаканал при этом забивает мусором.
...
Рейтинг: 0 / 0
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #39691376
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

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

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

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

а, ну понятно, я уже проходил. У меня ничего не вышло, нужно рисовать именно по тому фону где будет в итоге, попытки рисовать по прозрачному и накладывать ведут к корявому тексту, чем не рисуй - DirectX, GDI, GDI+
...
Рейтинг: 0 / 0
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #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
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #39691402
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

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

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

cleartype он многоцветный, а с path максимум антиалисинг будет
...
Рейтинг: 0 / 0
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #39691422
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне в целом и приличного антиалиасинга бы хватило.
...
Рейтинг: 0 / 0
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #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
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #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
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #39691464
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatДа и некоторые сомнения у меня в том рендер туевой хучи битмапок-букв - это быстро.это чудовищно быстро по сравнеию с любой векторной растеризацией

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

Какие буквы в слове "быстро" тебе не понятны?
...
Рейтинг: 0 / 0
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #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
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #39691613
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)это чудовищно быстро по сравнеию с любой векторной растеризацией
Мда? А мне практика показывала иное.
В винде шрифтовый движек просто ну ОЧЕНЬ быстр. Поднимаю шляпу перед создателями.
...
Рейтинг: 0 / 0
Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
    #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
25 сообщений из 55, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как быстро(!) рисовать текст на битмапку с учетом альфа канала?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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