Лечим смещение на полпикселя в GDI+ Проблема Есть такая проблема, что GDI+ считает координату (0,0) центром пикселя, а не его углом. Смотрим правый рисунок - узлы сетки ровно в середине пикселя. Последствия (центральный рисунок): - Смещение на полпикселя - изображение сдвинуто относительно GDI и D2D; - Размытие линий - горизонтальная линия толщиной 1px в точке y=0 размывается на два ряда пикселей (по 50%); - Несовпадение координат - прямоугольник (0,0,100,100) в GDI+ занимает другую область, чем...
IP76.RU Графика. Математика. Delphi.
Алгоритмы, исходники, теория, GDI, GDI+, D2D
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
20 из 20Получить TBitmap из любого TGraphic с масштабированием Иногда надо получить Bitmap из какого-либо графического формата для последующей обработки, анализа и прочего. Но порой попадается такое здоровенное изображение, что работать с ним становится мучительно больно из-за вполне предсказуемых тормозов. Хочется битмап поменьше, но без потери качества и прозрачности. Ниже можно скачать небольшой модуль. Там пока три функции. Основная задача: либо просто конвертируют TGraphic в TBitmap, либо масштабир...
Убираем фон в один клик Сделал новый инструмент в копилку. Загружаем картинку из файла или буфера обмена, жмём кнопку "Убрать фон". Думать будет долго, но почти всегда результат будет хорошим. Сохраняет в заказанном формате (JPEG, PNG, WebP) и в размерах оригинала. Алгоритм убирания фона не мой, этот: @imgly/background-removal. Попробовать убрать фон...
Эффект стекла: Как смешивать Direct2D эффекты Пример микса D2D-эффектов: D2D1GaussianBlur + D2D1Brightness [+ D2D1Tile + D2D1ColorMatrix + D2D1Blend]. В обойме эффектов D2D шума нет (если не считать Перлина). Поэтому здесь присутствует два вида шума: рукописный (на битмапах и ScanLine'ах) и с помощью дополнительного микса эффектов D2D (которые в квадратных скобках). - NoiseD2D переключает режимы; - Ползунок рядом регулирует шум. Исходник (294 Кб) Delphi XE7 Прога (x64) (1.5 Мб)
Сохранить битмап в формате png, jpg, gif, bmp Каким бы образом мы не получили изображение, внутри программы работаем только с битмап. Но бывает нужно сохранять результат. И как-то глупо сохранять его всегда в bmp. Альтернативное и простое решение, без использования TGraphicClass - через TWICImage. Работают встроенные конверторы Windows. Если для битмапа указано: PixelFormat = pf32bit и AlphaFormat <> afIgnored то в PNG будет экспортироваться сразу с прозрачностью procedure SaveBitmapAs(Bitmap: T...
Друзья! С Новым 0x07EA годом! Пусть ваши баги будут тривиальными, а тикеты — закрытыми. Желаю нулевых AV на продакшне и своевременного Free для объектов. Пусть красота begin..end не перестаёт радовать глаз, а RAD означал «Реально Адекватный Дедлайн», а не «Ручная Адская Доработка». И пусть Delphi работает стабильнее, чем ваша любовь к Ctrl+Space!
TBitmap.ScanLine: Полное руководство Три способа работы с пикселями — от классического до быстрого и кэшированного. Четыре формата (pf1bit, pf8bit, pf24bit, pf32bit), шаблоны навигации по памяти, padding, bottom-up, типичные ошибки. Каждый пример — самодостаточная процедура, бери и используй. Внутри: бенчмарк, демо-приложение, исходники. Запланированное продолжение темы, поднятой 3 года назад. Планировалось две статьи подряд: TBitmap.PixelFormat и эта. Закрываю ментальный долг ))) Статья...
Избавляемся от фокусной рамки Иногда очень хочется избавиться от примитивной фокусной рамки на контроле. В некоторых случаях может помочь: function RecreateControlRgn( const AControl: TWinControl; const AMargin: TRect; const ARGN: NativeInt): NativeInt; var rct: TRect; begin if ARGN <> 0 then DeleteObject(ARGN); rct := AControl.ClientRect; rct.TopLeft := rct.TopLeft + AMargin.TopLeft; rct.BottomRight := rct.BottomRight - AMargin.BottomRight; Result := CreateRectRgn(rct.Left, rct.Top, rct.Right, ...
Кастомная отрисовка TrackBar'ов Недавно возник вопрос, как можно нарисовать TrackBar по своему усмотрению. Один из способов (не единственный) - это кастомная отрисовка через перехват CN_NOTIFY/WM_NOTIFY. Использовал класс ThlTrackBar. Правда, немного его допилил. Как рисовать - смотрим в главном модуле метод TrackBarCustomDraw. Отрисовка определённого стиля осуществляется набором из двух процедур: Draw<Style>Track и Draw<Style>Thumb. Шаблон промта для Claude 4.5 Opus (txt) Исходник (79 Кб) Delph...
Сделать цвет темнее или светлее Мега полезные функции. Рекомендую: function Darker(Color: TColor; Percent: Byte): TColor; var r, g, b: Byte; begin r := GetRValue(Color); g := GetGValue(Color); b := GetBValue(Color); r := r-muldiv(r, Percent, 100); g := g-muldiv(g, Percent, 100); b := b-muldiv(b, Percent, 100); Result := RGB(r, g, b); end; function Lighter(Color: TColor; Percent: Byte):TColor; var r, g, b: Byte; begin r := GetRValue(Color); g := GetGValue(Color); b := GetBValue(Color); r := r+mul...