Инструмент цветовой матрицы
Продолжаю мучить JS. Оторвался на стилях. Наверное, переборщил...
Давно хотел сделать такой инструмент.
Помимо редактирования непосредственно матрицы, есть ряд предопределённых эффектов, с подробным описанием каждого. Если есть интересные матрицы, присылайте, добавлю.
26 предустановленных эффектов:
- Сепия
- Черно-белое
- Негатив
- Усиление красного
- Сдвиг в синий
- Ярче
- Темнее
- Зеленая матрица
- Цианотипия
- Винтаж
- Полароид
- Lomo Эффект
- Инфракрасный
- Кросс-процесс
- Сновидческий
- Янтарный монохром
- Соляризация
- Фильм-нуар
- Техниколор
- Дуплекс
- Винтаж (улучшенный)
- Зелёная матрица (другая)
- Холодный тон
- Тёплый тон
- Высокая контрастность
- Цианотипия (улучшенная)
Ознакомиться с инструментом можно тут
Продолжаю мучить JS. Оторвался на стилях. Наверное, переборщил...
Давно хотел сделать такой инструмент.
Помимо редактирования непосредственно матрицы, есть ряд предопределённых эффектов, с подробным описанием каждого. Если есть интересные матрицы, присылайте, добавлю.
26 предустановленных эффектов:
- Сепия
- Черно-белое
- Негатив
- Усиление красного
- Сдвиг в синий
- Ярче
- Темнее
- Зеленая матрица
- Цианотипия
- Винтаж
- Полароид
- Lomo Эффект
- Инфракрасный
- Кросс-процесс
- Сновидческий
- Янтарный монохром
- Соляризация
- Фильм-нуар
- Техниколор
- Дуплекс
- Винтаж (улучшенный)
- Зелёная матрица (другая)
- Холодный тон
- Тёплый тон
- Высокая контрастность
- Цианотипия (улучшенная)
Ознакомиться с инструментом можно тут
🔥7👍1
Шум Перлина: Разбор алгоритма
Разбор механики этого замечательного изобретения. Где математика становится частью естественного хаоса.
Это не просто математика — это поэзия, воплощенная в коде.
Внутри есть приятный интерактив и непременные исходники.
Приятного чтения!!!
Разбор механики этого замечательного изобретения. Где математика становится частью естественного хаоса.
Это не просто математика — это поэзия, воплощенная в коде.
Внутри есть приятный интерактив и непременные исходники.
Приятного чтения!!!
🔥10
This media is not supported in your browser
VIEW IN TELEGRAM
Перспективная трансформация онлайн
Когда-то озадачился такой вещью, как перспективная трансформация. Теперь дошли руки сделать это онлайн.
- Сохраняет в PNG, фон прозрачный.
- Сохраняет и копирует в размерах оригинального файла.
- Ограничений на размер оригинального файла нет.
Новый инструмент в коллекции - перспективная трансформация
Когда-то озадачился такой вещью, как перспективная трансформация. Теперь дошли руки сделать это онлайн.
- Сохраняет в PNG, фон прозрачный.
- Сохраняет и копирует в размерах оригинального файла.
- Ограничений на размер оригинального файла нет.
Новый инструмент в коллекции - перспективная трансформация
🔥9
Конвертер изображений в черно-белое
Сейчас совсем нет времени на полноценные статьи.
Поэтому, вот новый инструмент для преобразования исходного изображения в градации серого и истинно черно-белое. Умеет менять яркость-контраст-чёткость-резкость исходного изображения. Поддерживает количество градаций серого и дизеринг. Инструмент писать быстрее, чем статью.
Очень хотелось попробовать сделать дизеринг. Это когда в черно-белом изображении, если есть ограничения на используемые цвета (например, в истинно чёрно-белом только два цвета), имитируем градации определёнными узорами. Вот как дама справа на рисунке - там дизеринг, и там всего два цвета.
Инструмент тут...
Сейчас совсем нет времени на полноценные статьи.
Поэтому, вот новый инструмент для преобразования исходного изображения в градации серого и истинно черно-белое. Умеет менять яркость-контраст-чёткость-резкость исходного изображения. Поддерживает количество градаций серого и дизеринг. Инструмент писать быстрее, чем статью.
Очень хотелось попробовать сделать дизеринг. Это когда в черно-белом изображении, если есть ограничения на используемые цвета (например, в истинно чёрно-белом только два цвета), имитируем градации определёнными узорами. Вот как дама справа на рисунке - там дизеринг, и там всего два цвета.
Инструмент тут...
🔥11
Напоминалка: Преобразовать число в строку без SysUtils
Всем нам известны такие функции, как IntToStr, FloatToStr и т.д. Что делать, если использовать SysUtils нельзя или нежелательно? Для этого существует ядерная процедура Str. Про которую не сразу и вспомнишь.
Преобразует целое число или число с плавающей точкой X в строку, с возможностью указания необязательных настроек форматирования. Примеры и описание.
Всем нам известны такие функции, как IntToStr, FloatToStr и т.д. Что делать, если использовать SysUtils нельзя или нежелательно? Для этого существует ядерная процедура Str. Про которую не сразу и вспомнишь.
procedure Str(const X [: Width [:Decimals]]; var S: String);
Преобразует целое число или число с плавающей точкой X в строку, с возможностью указания необязательных настроек форматирования. Примеры и описание.
procedure TForm1.Button1Click(Sender: TObject);
var S: string;
begin
// '123'
Str(123, S); Label1.Caption := S;
// ' 123'
Str(123:30, S); Label2.Caption := S;
// ' 1.23456000000000E+0002'
Str(123.456, S); Label3.Caption := S;
// ' 1.23456000000000000E+0002'
Str(123.456:30, S); Label4.Caption := S;
// ' 123.4560'
Str(123.456:30:4, S); Label5.Caption := S;
end;
🔥3👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Итеративный алгоритм Рамера-Дугласа-Пекера
Дополнил статью итеративным алгоритмом. Мне конечно был милее рекурсивный вариант, но вот возникла необходимость в таком его прочтении. Заодно оптимизировал рекурсивный. Итеративный оказался медленней собрата, поэтому пришлось до кучи оптимизировать и его. Теперь у нас есть три разновидности алгоритма Рамера-Дугласа-Пекера: рекурсивный, итеративный и шустрый.
Всё детально описал. Надеюсь пригодится.
Четыре нюанса реализации...
Переход сразу на итеративный алгоритм...
Дополнил статью итеративным алгоритмом. Мне конечно был милее рекурсивный вариант, но вот возникла необходимость в таком его прочтении. Заодно оптимизировал рекурсивный. Итеративный оказался медленней собрата, поэтому пришлось до кучи оптимизировать и его. Теперь у нас есть три разновидности алгоритма Рамера-Дугласа-Пекера: рекурсивный, итеративный и шустрый.
Всё детально описал. Надеюсь пригодится.
Четыре нюанса реализации...
Переход сразу на итеративный алгоритм...
👍3🔥3
Кроссплатформенная MulDiv для Delphi
Сделал кроссплатформенную версию MulDiv для Delphi, проверил, описал.
Думал, что в 13-ой версии уже есть подобная штука, но нет.
Ради чрезвычайно шустрой Winapi-функции MulDiv приходится отказываться от всяческой кроссплатформенности. Хотелось сделать не только кроссплатформенный аналог, но и разогнать по скорости.
И вот, что у меня получилось:
Кроссплатформенная MulDiv тут...
Сделал кроссплатформенную версию MulDiv для Delphi, проверил, описал.
Думал, что в 13-ой версии уже есть подобная штука, но нет.
Ради чрезвычайно шустрой Winapi-функции MulDiv приходится отказываться от всяческой кроссплатформенности. Хотелось сделать не только кроссплатформенный аналог, но и разогнать по скорости.
И вот, что у меня получилось:
Кроссплатформенная MulDiv тут...
👍5🔥3
Разгоняем кроссплатформенный MulDiv
Теперь наш MulDiv с правильным округлением работает быстрее. А 64 битах работает быстрее оригинального! Peter, спасибо за наводку!
1) MulDiv стала быстрее за счёт небольшой оптимизации;
2) Появилась MulDiv32, более шустрая в 32 битах;
3) Появилась MulDiv64, оглушительно быстрая в 64 битах;
4) Появилась функция MulDivX, использующая преимущества двух предыдущих функций.
Исходник обновлены.
Теперь наш MulDiv с правильным округлением работает быстрее. А 64 битах работает быстрее оригинального! Peter, спасибо за наводку!
1) MulDiv стала быстрее за счёт небольшой оптимизации;
2) Появилась MulDiv32, более шустрая в 32 битах;
3) Появилась MulDiv64, оглушительно быстрая в 64 битах;
4) Появилась функция MulDivX, использующая преимущества двух предыдущих функций.
Исходник обновлены.
👍3🔥2
Эффект стекла: Как смешивать Direct2D эффекты
Пример микса D2D-эффектов: D2D1GaussianBlur + D2D1Brightness [+ D2D1Tile + D2D1ColorMatrix + D2D1Blend].
В обойме эффектов D2D шума нет (если не считать Перлина). Поэтому здесь присутствует два вида шума: рукописный (на битмапах и ScanLine'ах) и с помощью дополнительного микса эффектов D2D (которые в квадратных скобках).
- NoiseD2D переключает режимы;
- Ползунок рядом регулирует шум.
Исходник (294 Кб) Delphi XE7
Прога (x64) (1.5 Мб)
Пример микса D2D-эффектов: D2D1GaussianBlur + D2D1Brightness [+ D2D1Tile + D2D1ColorMatrix + D2D1Blend].
В обойме эффектов D2D шума нет (если не считать Перлина). Поэтому здесь присутствует два вида шума: рукописный (на битмапах и ScanLine'ах) и с помощью дополнительного микса эффектов D2D (которые в квадратных скобках).
- NoiseD2D переключает режимы;
- Ползунок рядом регулирует шум.
Исходник (294 Кб) Delphi XE7
Прога (x64) (1.5 Мб)
🔥6👍1
Друзья! С Новым 0x07EA годом!
Пусть ваши баги будут тривиальными, а тикеты — закрытыми. Желаю нулевых AV на продакшне и своевременного Free для объектов. Пусть красота begin..end не перестаёт радовать глаз, а RAD означал «Реально Адекватный Дедлайн», а не «Ручная Адская Доработка». И пусть Delphi работает стабильнее, чем ваша любовь к Ctrl+Space!
Пусть ваши баги будут тривиальными, а тикеты — закрытыми. Желаю нулевых AV на продакшне и своевременного Free для объектов. Пусть красота begin..end не перестаёт радовать глаз, а RAD означал «Реально Адекватный Дедлайн», а не «Ручная Адская Доработка». И пусть Delphi работает стабильнее, чем ваша любовь к Ctrl+Space!
👍7🔥5
Убираем фон в один клик
Сделал новый инструмент в копилку. Загружаем картинку из файла или буфера обмена, жмём кнопку "Убрать фон". Думать будет долго, но почти всегда результат будет хорошим. Сохраняет в заказанном формате (JPEG, PNG, WebP) и в размерах оригинала.
Алгоритм убирания фона не мой, этот: @imgly/background-removal.
Попробовать убрать фон...
Сделал новый инструмент в копилку. Загружаем картинку из файла или буфера обмена, жмём кнопку "Убрать фон". Думать будет долго, но почти всегда результат будет хорошим. Сохраняет в заказанном формате (JPEG, PNG, WebP) и в размерах оригинала.
Алгоритм убирания фона не мой, этот: @imgly/background-removal.
Попробовать убрать фон...
🔥6
Сделать цвет темнее или светлее
Мега полезные функции. Рекомендую:
Мега полезные функции. Рекомендую:
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+muldiv(255-r, Percent, 100);
g := g+muldiv(255-g, Percent, 100);
b := b+muldiv(255-b, Percent, 100);
Result := RGB(r, g, b);
end;
🔥3👍1
Избавляемся от фокусной рамки
Иногда очень хочется избавиться от примитивной фокусной рамки на контроле. В некоторых случаях может помочь:
Использовать, например, так:
Работает со стилями, и без.
Иногда очень хочется избавиться от примитивной фокусной рамки на контроле. В некоторых случаях может помочь:
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, rct.Bottom);
SetWindowRgn(AControl.Handle,
Result, TRUE);
end;
Использовать, например, так:
procedure TForm1.FormResize(Sender: TObject);
var i: Integer; P: TWinControl;
begin
for i := 0 to ComponentCount-1 do
if (Components[i] is TTrackBar) then
begin
P := TWinControl(Components[i]);
P.Tag := RecreateControlRgn(
P, Rect(1, 1, 1, 1), P.Tag);
end;
end;
Работает со стилями, и без.
👍2🔥2
Сохранить битмап в формате png, jpg, gif, bmp
Каким бы образом мы не получили изображение, внутри программы работаем только с битмап. Но бывает нужно сохранять результат. И как-то глупо сохранять его всегда в bmp.
Альтернативное и простое решение, без использования TGraphicClass - через TWICImage. Работают встроенные конверторы Windows.
Если для битмапа указано:
PixelFormat = pf32bit и
AlphaFormat <> afIgnored
то в PNG будет экспортироваться сразу с прозрачностью
Каким бы образом мы не получили изображение, внутри программы работаем только с битмап. Но бывает нужно сохранять результат. И как-то глупо сохранять его всегда в bmp.
Альтернативное и простое решение, без использования TGraphicClass - через TWICImage. Работают встроенные конверторы Windows.
Если для битмапа указано:
PixelFormat = pf32bit и
AlphaFormat <> afIgnored
то в PNG будет экспортироваться сразу с прозрачностью
procedure SaveBitmapAs(Bitmap: TBitmap;
const FileName: string);
var WIC: TWICImage; S: string;
begin
WIC := TWICImage.Create;
try
WIC.Assign(Bitmap);
S := ExtractFileExt(FileName).ToLower;
if S='.png' then
WIC.ImageFormat := wifPng
else if (S='.jpg') or (S='.jpeg') then
WIC.ImageFormat := wifJpeg
else if S='.gif' then
WIC.ImageFormat := wifGif
else
WIC.ImageFormat := wifBmp;
WIC.SaveToFile(FileName);
finally
WIC.Free;
end;
end;
🔥6👍1
Масштаб и сдвиг многоугольника
Быстрый масштаб и сдвиг для 2D-полигона:
#geom_code
Быстрый масштаб и сдвиг для 2D-полигона:
type
// Динамический массив вещественных 2D-точек
TPointFDynArray = TArray<TPointF>;
// Вычисляет новый полигон с трансформацией
function TransformPolygon(
const Pts: TPointFDynArray;
Count: Integer;
sX, sY, dX, dY: Single): TPointFDynArray;
var I: Integer; Src, Dst: PSingle;
begin
if Count <= 0 then
Count := Length(Pts);
SetLength(Result, Count);
if Count = 0 then exit;
Src := @Pts[0];
Dst := @Result[0];
for I := 0 to Count - 1 do
begin
Dst^ := Src^ * sX + dX; // X
Inc(Src); Inc(Dst);
Dst^ := Src^ * sY + dY; // Y
Inc(Src); Inc(Dst);
end;
end;
#geom_code
🔥6
Получить TBitmap из любого TGraphic с масштабированием
Иногда надо получить Bitmap из какого-либо графического формата для последующей обработки, анализа и прочего. Но порой попадается такое здоровенное изображение, что работать с ним становится мучительно больно из-за вполне предсказуемых тормозов. Хочется битмап поменьше, но без потери качества и прозрачности.
Ниже можно скачать небольшой модуль. Там пока три функции. Основная задача: либо просто конвертируют TGraphic в TBitmap, либо масштабируют, если какой-либо из размеров (Width|Height) превышает указанный максимум. Если в TGraphic есть прозрачность, то она сохранится.
- CreateBitmapFromGraphic - всё делает шустро. Используется GDI + HALFTONE;
- CreateBitmapFromGraphicHQ - всё делает в высоком качестве. Используется GDI+. Конвертирование происходит через поток;
- CreateBitmapFromGraphicD2D - всё делает в высочайшем качестве. Используется D2D. Работаем с WIC на низком уровне. Причины изложены в коде.
Скачать модуль (zip)
Иногда надо получить Bitmap из какого-либо графического формата для последующей обработки, анализа и прочего. Но порой попадается такое здоровенное изображение, что работать с ним становится мучительно больно из-за вполне предсказуемых тормозов. Хочется битмап поменьше, но без потери качества и прозрачности.
Ниже можно скачать небольшой модуль. Там пока три функции. Основная задача: либо просто конвертируют TGraphic в TBitmap, либо масштабируют, если какой-либо из размеров (Width|Height) превышает указанный максимум. Если в TGraphic есть прозрачность, то она сохранится.
- CreateBitmapFromGraphic - всё делает шустро. Используется GDI + HALFTONE;
- CreateBitmapFromGraphicHQ - всё делает в высоком качестве. Используется GDI+. Конвертирование происходит через поток;
- CreateBitmapFromGraphicD2D - всё делает в высочайшем качестве. Используется D2D. Работаем с WIC на низком уровне. Причины изложены в коде.
Скачать модуль (zip)
🔥9
Лечим смещение на полпикселя в GDI+
Проблема
Есть такая проблема, что GDI+ считает координату (0,0) центром пикселя, а не его углом. Смотрим правый рисунок - узлы сетки ровно в середине пикселя.
Последствия (центральный рисунок):
- Смещение на полпикселя - изображение сдвинуто относительно GDI и D2D;
- Размытие линий - горизонтальная линия толщиной 1px в точке y=0 размывается на два ряда пикселей (по 50%);
- Несовпадение координат - прямоугольник (0,0,100,100) в GDI+ занимает другую область, чем в GDI.
Решение
Раньше борол это тем, что вычитал полпикселя из координат. И относительно недавно узнал, что можно это решить всего лишь одной строкой:
Причины
GDI+ создавался как “улучшенный GDI” с акцентом на сглаживание и качество. Центрирование координат на пикселях даёт более симметричный антиалиасинг для векторных фигур.
Но для работы с растровыми изображениями и совместимости с другими API это делает головную боль.
Проблема
Есть такая проблема, что GDI+ считает координату (0,0) центром пикселя, а не его углом. Смотрим правый рисунок - узлы сетки ровно в середине пикселя.
Последствия (центральный рисунок):
- Смещение на полпикселя - изображение сдвинуто относительно GDI и D2D;
- Размытие линий - горизонтальная линия толщиной 1px в точке y=0 размывается на два ряда пикселей (по 50%);
- Несовпадение координат - прямоугольник (0,0,100,100) в GDI+ занимает другую область, чем в GDI.
Решение
Раньше борол это тем, что вычитал полпикселя из координат. И относительно недавно узнал, что можно это решить всего лишь одной строкой:
var
Graphics: TGPGraphics;
...
Graphics.SetPixelOffsetMode(
PixelOffsetModeHalf);
Причины
GDI+ создавался как “улучшенный GDI” с акцентом на сглаживание и качество. Центрирование координат на пикселях даёт более симметричный антиалиасинг для векторных фигур.
Но для работы с растровыми изображениями и совместимости с другими API это делает головную боль.
🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Кастомная отрисовка TrackBar'ов
Недавно возник вопрос, как можно нарисовать TrackBar по своему усмотрению.
Один из способов (не единственный) - это кастомная отрисовка через перехват CN_NOTIFY/WM_NOTIFY.
Использовал класс ThlTrackBar. Правда, немного его допилил.
Как рисовать - смотрим в главном модуле метод TrackBarCustomDraw.
Отрисовка определённого стиля осуществляется набором из двух процедур: Draw<Style>Track и Draw<Style>Thumb.
Шаблон промта для Claude 4.5 Opus (txt)
Исходник (79 Кб) Delphi XE7
Прога (926 Кб)
Недавно возник вопрос, как можно нарисовать TrackBar по своему усмотрению.
Один из способов (не единственный) - это кастомная отрисовка через перехват CN_NOTIFY/WM_NOTIFY.
Использовал класс ThlTrackBar. Правда, немного его допилил.
Как рисовать - смотрим в главном модуле метод TrackBarCustomDraw.
Отрисовка определённого стиля осуществляется набором из двух процедур: Draw<Style>Track и Draw<Style>Thumb.
Шаблон промта для Claude 4.5 Opus (txt)
Исходник (79 Кб) Delphi XE7
Прога (926 Кб)
🔥5👍2
Гипнотический текст
Эффект получился случайно, другое делал, подумал, что надо на тексте опробовать. И вот что получилось. Думаю, надо сохранить в копилке эффектов.
Текстовый туннель - гипнотический эффект бесконечного приближения текста с иллюзией глубины и плавной сменой цветовых схем. Реализовано через GDI+. Три стиля отрисовки: PathGradient, LinearGradient, Hypnotic — переключение Ctrl+1/2/3. Или кнопками рядом с текстом 1/2/3.
В Hypnotic-режиме 4 цветовые схемы (Default, Fog, Night, Pastel), выбор через контекстное меню на поле отрисовки.
Интересный получится вид, если задать строку I_____I или R_____Я.
Исходник (64 Кб) Delphi XE7
Прога (930 Кб)
Эффект получился случайно, другое делал, подумал, что надо на тексте опробовать. И вот что получилось. Думаю, надо сохранить в копилке эффектов.
Текстовый туннель - гипнотический эффект бесконечного приближения текста с иллюзией глубины и плавной сменой цветовых схем. Реализовано через GDI+. Три стиля отрисовки: PathGradient, LinearGradient, Hypnotic — переключение Ctrl+1/2/3. Или кнопками рядом с текстом 1/2/3.
В Hypnotic-режиме 4 цветовые схемы (Default, Fog, Night, Pastel), выбор через контекстное меню на поле отрисовки.
Интересный получится вид, если задать строку I_____I или R_____Я.
Исходник (64 Кб) Delphi XE7
Прога (930 Кб)
🔥6🤔2
Отрисовка битмапа с масштабированием и отсечением невидимой области
Модуль ImageDrawing предоставляет возможности отрисовки TBitmap на канве с масштабированием и поддержкой прозрачности, используя три разных движка: GDI, GDI+ и Direct2D. Для GDI+ и D2D определяет видимую часть изображения и рисует только её, что позволяет рисовать быстро, даже при бикубической интерполяции.
Можно указать качество отрисовки:
- dqFast - без сглаживания (видны пиксели)
- dqMedium - билинейная интерполяция (среднее, возможна "мыльность")
- dqHigh - бикубическая интерполяция(высокое, лучше сохраняет резкость).
Вызов соответствующей функции рендеринга:
- GDI: использует StretchBlt/AlphaBlend/TransparentBlt с настройкой режима растяжения
- GDI+: конвертирует битмап в TGPBitmap и рисует с настраиваемой интерполяцией
- Direct2D: через WIC создаёт ID2D1Bitmap и использует TDirect2DCanvas с поддержкой бикубической интерполяции через ID2D1DeviceContext
Скачать ImageDrawing (+Winapi.D2DMissing)
Модуль ImageDrawing предоставляет возможности отрисовки TBitmap на канве с масштабированием и поддержкой прозрачности, используя три разных движка: GDI, GDI+ и Direct2D. Для GDI+ и D2D определяет видимую часть изображения и рисует только её, что позволяет рисовать быстро, даже при бикубической интерполяции.
Можно указать качество отрисовки:
- dqFast - без сглаживания (видны пиксели)
- dqMedium - билинейная интерполяция (среднее, возможна "мыльность")
- dqHigh - бикубическая интерполяция(высокое, лучше сохраняет резкость).
Вызов соответствующей функции рендеринга:
- GDI: использует StretchBlt/AlphaBlend/TransparentBlt с настройкой режима растяжения
- GDI+: конвертирует битмап в TGPBitmap и рисует с настраиваемой интерполяцией
- Direct2D: через WIC создаёт ID2D1Bitmap и использует TDirect2DCanvas с поддержкой бикубической интерполяции через ID2D1DeviceContext
Скачать ImageDrawing (+Winapi.D2DMissing)
🔥8
TBitmap.ScanLine: Полное руководство
Три способа работы с пикселями — от классического до быстрого и кэшированного. Четыре формата (pf1bit, pf8bit, pf24bit, pf32bit), шаблоны навигации по памяти, padding, bottom-up, типичные ошибки. Каждый пример — самодостаточная процедура, бери и используй.
Внутри: бенчмарк, демо-приложение, исходники.
Запланированное продолжение темы, поднятой 3 года назад. Планировалось две статьи подряд: TBitmap.PixelFormat и эта. Закрываю ментальный долг )))
Статья...
Три способа работы с пикселями — от классического до быстрого и кэшированного. Четыре формата (pf1bit, pf8bit, pf24bit, pf32bit), шаблоны навигации по памяти, padding, bottom-up, типичные ошибки. Каждый пример — самодостаточная процедура, бери и используй.
Внутри: бенчмарк, демо-приложение, исходники.
Запланированное продолжение темы, поднятой 3 года назад. Планировалось две статьи подряд: TBitmap.PixelFormat и эта. Закрываю ментальный долг )))
Статья...
🔥8