191просмотров
13 января 2026 г.
📷 ФотоScore: 210
Лечим смещение на полпикселя в GDI+ Проблема
Есть такая проблема, что GDI+ считает координату (0,0) центром пикселя, а не его углом. Смотрим правый рисунок - узлы сетки ровно в середине пикселя.
Последствия (центральный рисунок):
- Смещение на полпикселя - изображение сдвинуто относительно GDI и D2D;
- Размытие линий - горизонтальная линия толщиной 1px в точке y=0 размывается на два ряда пикселей (по 50%);
- Несовпадение координат - прямоугольник (0,0,100,100) в GDI+ занимает другую область, чем в GDI. Решение
Раньше борол это тем, что вычитал полпикселя из координат. И относительно недавно узнал, что можно это решить всего лишь одной строкой:
var Graphics: TGPGraphics;
... Graphics.SetPixelOffsetMode( PixelOffsetModeHalf); Причины
GDI+ создавался как “улучшенный GDI” с акцентом на сглаживание и качество. Центрирование координат на пикселях даёт более симметричный антиалиасинг для векторных фигур.
Но для работы с растровыми изображениями и совместимости с другими API это делает головную боль.