Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26061
Рейтинг: 2119
#91: 2022-01-25 00:35:34 ЛС | профиль | цитата
andrestudio писал(а):
GDI + antialiasing всегда будут проблемы с background в GDI+ в априори такого быть не может

Вот эту совокупность фраз я честно не понял. Начал экспериментировать. AntiAliace из AnalogGauge пошел лесом сразу, убил на него часа три (ну никак он не хотел сглаживать увеличенные картинки, выдавал их как есть, но в исходном разрешении). Пока не понял, что отрисовка работает сразу на увеличенном контексте, а если увеличить картинку обычными средствами, то получишь на всю группу используемых точек (для метода сглаживания) один цвет. Те, увеличил картинку в 4-ре раза для максимального сглаживания, получил 16 одинаковых точек на каждый исходный пиксель рисунка.
Попробовал GDI+, работает, меняет сглаживание и режимы интерполяции, но, блин, не впечатляет как-то, слабовато, что ли



Стоят режимы -- SmoothingModeAntiAlias и InterpolationModeHighQualityBicubic

А вот код GDI
  // создадим образец в памяти на базе нашего изображения
GdipCreateBitmapFromHBITMAP(FFaceBitmap.Handle, 0, gpBmp);

// свяжем контекст FAABitmap.Canvas.Handle: HDC с GDI+
GdipCreateFromHDC(FAABitmap.Canvas.Handle, Context);

// установим антиалиасинг для изображений
GdipSetSmoothingMode(Context, SmoothingModeAntiAlias);

// установим сжатие по бикубическому алгоритму
GdipSetInterpolationMode(Context, InterpolationModeHighQualityBicubic);

// выведем изображение исходя из нашей области
GdipDrawImageRectRect(Context, gpBmp, 0, 0, FAABitmap.Width, FAABitmap.Height, 0, 0, FFaceBitmap.Width, FFaceBitmap.Height, UnitPixel, NIL, NIL, NIL);
Че тут можно еще улучшить? Попробую еще сжать обратно с использованием сглаживания.

Редактировалось 3 раз(а), последний 2022-01-25 00:43:33
карма: 22

0
Разработчик
Ответов: 26061
Рейтинг: 2119
#92: 2022-01-25 01:37:06 ЛС | профиль | цитата
Вот, что получилось:



Слева -- сглаживание на штатных компонентах, справа -- GDI. GDI, КМК, похуже качеством изображения (артефакты какие-то по краям), но быстрее в 3 раза (100ms HiAsm против 33ms GDI).

Редактировалось 3 раз(а), последний 2022-01-25 01:43:08
карма: 22

0
Ответов: 5227
Рейтинг: 585
#93: 2022-01-25 06:09:01 ЛС | профиль | цитата
nesco писал(а):
Вот эту совокупность фраз я честно не понял.

Если фон не однородный (к примеру градиентный)
nesco, я так понимаю что ты пытаешься сгладить картинку нарисованную через GDI средствами GDI+ Если да то так не делают. Рисовать нужно соответственно средствами GDI+. Контекст там увеличивать и уменьшать не придётся. Просто включил антиалиасинг где нужен и выключаешь где не нужен для увеличения быстродействия.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 5227
Рейтинг: 585
#94: 2022-01-25 11:17:52 ЛС | профиль | цитата
Кстати почему API, чем объектная модель не устроила из GDIPOBJ.pas
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26061
Рейтинг: 2119
#95: 2022-01-25 13:20:22 ЛС | профиль | цитата
andrestudio писал(а):
я так понимаю что ты пытаешься сгладить картинку нарисованную через GDI средствами GDI+

Нет. Мне надо свою картинку сгладить (PBitmap которая, и этот же класс вернуть обратно), не собираюсь я сейчас все переделывать на GDI. Я просо пытаюсь его прикрутить к тому, что есть, те создать типа элемента сглаживания. Глобальных задач я пока себе не ставил.
andrestudio писал(а):
Кстати почему API, чем объектная модель не устроила из GDIPOBJ.pas

Вот что нашел подходящего под задачу, то и сделал, да и это еще пришлось поискать. В основном рисование.
Если я сейчас возьмусь за все одновременно, я просто потеряюсь.

Редактировалось 1 раз(а), последний 2022-01-25 13:25:28
карма: 22

0
Ответов: 5227
Рейтинг: 585
#96: 2022-01-25 13:52:58 ЛС | профиль | цитата
Понятно, колдуй!
nesco, раз уж у тебя жёлтые штаны как думаешь разве вот людям это не нужно https://forum.hiasm.com/post/310657
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26061
Рейтинг: 2119
#97: 2022-01-25 14:22:28 ЛС | профиль | цитата
andrestudio писал(а):
как думаешь разве вот людям это не нужно https://forum.hiasm.com/post/310657

Кое чего подшаманить, думаю, что нужно. Хотя ты бы мог и стандартный переделать под эти задачи. Или воткнуть все в один элемент с выбором режимов.

Редактировалось 1 раз(а), последний 2022-01-25 14:22:58
карма: 22

0
Ответов: 5227
Рейтинг: 585
#98: 2022-01-25 14:28:34 ЛС | профиль | цитата
nesco, не, не стал размежовывать, так и в VCL делают. (хотя кодировал сам не слизывая) Нефиг лишнего тащить, пользователь сам выберет нужный. Подшаманить проблем нет, знать бы что?
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26061
Рейтинг: 2119
#99: 2022-01-25 14:31:45 ЛС | профиль | цитата
А мне пока что удалось из схемы выдавить только вот это:



Отрисовка всего контекста -- 12ms

Твоя идея применения суперсэмплинга мне теперь покоя не дает. Да и код AntiAliacinga из AnalogGaug-a у меня под Alpha-канал уже переделанный есть. Кто бы дал силы и желание переписать DocumentTemplate под суперсэмплинг.

--- Добавлено в 2022-01-25 14:44:00

andrestudio писал(а):
знать бы что?

Первое -- приведи размеры к стандартным, а то один огромный, а другие под лупой рассматривать надо. Возьми размеры со стандартного, по длине как у чекбоксов. Второе -- почему нет квадрата при увеличении прямоугольного светодиода. Сделай хотя бы свойство авторастяжки (вкл/выкл), дефолтно включенное. Третье -- меня , кстати, ввело в ступор, это отсутствие точек управления. Хотя бы одну оставь к примеру -- doChangeValue. Четвертое -- почему нет управления цветом блика, ведь такая возможность есть? Пятое -- если будем добавлять для народа, то *.dll не добавляются на SVN, только *.pas файлы.

P.S. Появилась идея создать отдельную вкладку для LED-контролов и все туда переслать.

Редактировалось 4 раз(а), последний 2022-01-25 14:49:33
карма: 22

0
Ответов: 5227
Рейтинг: 585
#100: 2022-01-25 15:50:49 ЛС | профиль | цитата
nesco, в GDI+ нет RoundRectangle к сожалению, но есть FillPath и DrawPath
мне конечно неизвестно что ты колдуешь но отпрвной точкой для создания GDI+ контролов был именно этот код, можешь сравнить с руш в котором сам чёрт ногу сломит
Практически заготовка для градиентной панели. (градиентная панель есть и в KOL, просто поверте у меня старый комп, но это очень плохой выбор)

Add(MainForm,2953706,63,56)
{
Width=410
Height=187
}
Add(InlineCode,9888594,168,126)
{
WorkPoints=#20:doDrawRoundRectangle|
DataPoints=#4:Ctrl|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|45:uses kol,Windows,Share,Debug,GDIPOBJ,GDIPAPI;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|21: Ctrl: THI_Event;|62: procedure doDrawRoundRectangle(var dt: TData; idx: word);|5: end;|1: |85:function CreateRoundRectangle(rectangle: TGPRect; radius: integer): TGPGraphicsPath; |0:|14:implementation|0:|66:function IntToGPColor(Value: TColor; Alpha: byte = 255): TGPColor;|3:var|47: ArrARGB: array [0..2] of byte absolute Value;|5:begin|70: Result := GDIPAPI.MakeColor(Alpha,ArrARGB[0],ArrARGB[1],ArrARGB[2]);|4:end;|0:|43:procedure THiAsmClass.doDrawRoundRectangle;|3:var|20: Control: PControl;|11: R: TRect;|24: Graphics: TGPGraphics;|24: Path: TGPGraphicsPath;|18: GPRect: TGPRect;|18: Brush: TGPBrush;|15: Pen: TGPPen; |36: Color1,Color2,PenColor: TGPColor; |5:begin|34: Control := ReadControl(Ctrl,'');|26: R := Control.ClientRect;|30: Dec(R.Bottom); Dec(R.Right);|56: Graphics := TGPGraphics.Create(Control.Canvas.Handle);|52: Graphics.SetSmoothingMode(SmoothingModeAntiAlias);|32: GPRect := GDIPAPI.MakeRect(R);|42: Path := CreateRoundRectangle(GPRect,20);|34: Color1 := IntToGPColor(clWhite);|38: Color2 := IntToGPColor(clSkyBlue); |93: Brush := TGPLinearGradientBrush.Create(GPRect, Color1, Color2, LinearGradientModeVertical);|33: Graphics.FillPath(Brush, Path);|36: PenColor := IntToGPColor($FFAD5B);|35: Pen := TGPPen.Create(PenColor); |30: Graphics.DrawPath(Pen,Path);|2: |39: // можно и GDI совместно использовать|45: Control.Canvas.Brush.BrushStyle := bsClear;|43: //Control.Canvas.DrawText('Caption',R,0);|42: Control.Canvas.TextOut(10,10,'Caption');|2: |11: Pen.Free;|13: Brush.Free;|12: Path.Free;|19: Graphics.Free; |4:end;|77:// https://stackoverflow.com/questions/8738635/delphi-roundrect-with-gradient|49:function CreateRoundRectangle(rectangle: TGPRect;|36: radius: integer): TGPGraphicsPath;|3:var|24: path: TGPGraphicsPath;|21: l,t,w,h,d: integer;|5:begin|33: path := TGPGraphicsPath.Create;|19: l := rectangle.X;|19: t := rectangle.y;|23: w := rectangle.Width;|24: h := rectangle.Height;|35: d := radius div 2; // divide by 2|0:|66: // the lines beween the arcs are automatically added by the path|46: path.AddArc(l, t, d, d, 180, 90); // topleft|55: path.AddArc(l + w - d, t, d, d, 270, 90); // topright|64: path.AddArc(l + w - d, t + h - d, d, d, 0, 90); // bottomright|56: path.AddArc(l, t + h - d, d, d, 90, 90); // bottomleft|21: path.CloseFigure();|17: Result := path;|4:end;|0:|4:end.|
link(Ctrl,6406300:PHandle,[])
}
Add(PaintBox,6406300,161,56)
{
Left=50
Top=35
Width=110
Height=70
Font=[Tahoma,8,0,128,0]
Point(PHandle)
Point(onPaint)
link(onPaint,9888594:doDrawRoundRectangle,[(205,69)(205,101)(156,101)(156,132)])
}


--- Добавлено в 2022-01-25 15:56:19

IntToGPColor может конечно не так обозвал но это моя прелесть , ну если кто сделает короче то снимаю шляпу...

Редактировалось 1 раз(а), последний 2022-01-25 15:56:19
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26061
Рейтинг: 2119
#101: 2022-01-25 17:05:00 ЛС | профиль | цитата
andrestudio писал(а):
Практически заготовка для градиентной панели

Здорово, теперь остались только муки выбора. Спс тебе за код, он еще пригодится. Я не хочу глобально трогать контролы. TrackBarRush мне кое-как удалось сделать полностью прозрачным, применив регионы, но это еще то решение.
Я хочу дать возможность конструировать нужные контролы самому. Больше всего для этого подходит только DocumentTemplate. И тут намечается два пути -- полностью переделать DocumentTemplate под GDI в Alpha-режиме, потому что обычный трогать не стоит, и оставить "As Is". Или применить к DocumentTemplate суперсэмплинг, что является самым коротким путем. Но, твой код точно пригодится, тк DocumentTemplate не поддерживает RoundRect для градиентного поля, а его неплохо бы иметь. Кстати, твой код может отрисовать на контексте принтера или ему пофиг на контекст, что подсунули, на том и отрисовали?

Редактировалось 1 раз(а), последний 2022-01-25 17:05:31
карма: 22

0
Ответов: 5227
Рейтинг: 585
#102: 2022-01-25 18:32:23 ЛС | профиль | цитата
nesco писал(а):
Кстати, твой код может отрисовать на контексте принтера или ему пофиг на контекст, что подсунули, на том и отрисовали?

Да скорей всего, это же контекст, хай какие то там масштабы для вывода.

nesco, с DocumentTemplate я не знаком, нужен был экспорт BmpToPDF я сделал.
Для руш контролов (TrackBarRush, PanelRush) достаточно процедурки DrawBackground для проблем с фоном


procedure THIClassName.DrawBackground(Sender: PControl);
var
org: TPoint;
hParent: HWND;
scrDC: HDC;
begin
try
hParent := Sender.Parent.GetWindowHandle;
scrDC := Sender.Canvas.Handle;
OffsetViewportOrgEx(scrDC, -Sender.Left, -Sender.Top, org);
SendMessage(hParent, WM_ERASEBKGND, scrDC, 0);
SendMessage(hParent, WM_PRINTCLIENT, scrDC, PRF_CLIENT);
SetViewportOrgEx(scrDC, org.x, org.y, nil);
except

end;
end;
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26061
Рейтинг: 2119
#103: 2022-01-25 19:07:55 ЛС | профиль | цитата
andrestudio писал(а):
достаточно процедурки DrawBackground для проблем с фоном

А куда ее втыкать, те когда необходимо правильно запустить отрисовку бэкграунда? Регион дает полную прозрачность, те компонент можно елозить по экрану, фон под ним останется, даже если он отрисован поверх других контролов. Применение регионов рекомендуют сами мелкомягкие, но его применение очень ресурсоемкое.
andrestudio писал(а):
какие то там масштабы для вывода

Вроде этим занимается сам компонент принтера.

--- Добавлено в 2022-01-25 19:11:05

andrestudio писал(а):
DocumentTemplate я не знаком

Это довольно мощный инструмент для отрисовки скомпонованных элементов на контексте. Те не надо думать какие смещения элементам давать, расставил на поле -- получил на экране.

Редактировалось 2 раз(а), последний 2022-01-25 19:11:05
карма: 22

0
Ответов: 4611
Рейтинг: 745
#104: 2022-01-25 23:42:47 ЛС | профиль | цитата
nesco писал(а):
Нет. Мне надо свою картинку сгладить (PBitmap которая, и этот же класс вернуть обратно)
Есть у меня такой код. Думал в Hiasm добавить, но пока не могу. Несколько дней на него потратил.
Называется ресемплингом или интерполяцией с помощью оконных функций. Реализованы такие методы как билинейная, бикубическая, Lanczos, SinC и некоторые другие.
карма: 26

0
Разработчик
Ответов: 26061
Рейтинг: 2119
#105: 2022-01-26 00:47:53 ЛС | профиль | цитата
Netspirit писал(а):
Есть у меня такой код. Думал в Hiasm добавить, но пока не могу

У нас есть компонент ResizeEx там реализован метод ресемплинга XBR4X, если туда еще и твой код прикрутить, хуже от этого не стало бы.
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)