Простое сглаживание изображения в Borland C++ Builder / Хабр
Многие из немногих людей программирующих на Borland C++ Builder сталкивались с небольшой, но не приятной проблемой. Загрузив большую картинку в компонент TImage и подогнав её под размер компонента встроенными свойствами, мы увидим не очень приемлемый результат. Картинка становится рубленой. Даже изображение без резких переходов становится через меру четким. Всему виной отсутствие у компонента TImage строенного сглаживания.
Решить эту проблему можно двумя способами:
1 способ. Найти аналог компонента TImage, в котором уже будет встроено сглаживание изображения.
2 способ. Написать свой алгоритм сглаживания растрового изображения, что мы и сделаем.
В алгоритме ниже сглаживание реализовано путём сложения цветов вокруг основной точки (включительно) и последующего их присвоения этой же точке.
Т. е. формула выглядит следующем образом:
point = x_left + x_right + y_top + y_down + point /5
На основе этой формулы у меня получился следующий код, который циклично обрабатывает каждый пиксель изображения, при этом разбивая его на 4 канала (ARGB).
void AntiAliasing(Graphics::TBitmap * & bitmap, int intensive)
{
struct rgb
{
Byte B,G,R,A;
};
rgb *line, *line1, *line2;
for(int i = 0; i <= intensive; i++)
for(int y = 1; y < bitmap->Height - 1; y++)
{
line = (rgb*)bitmap->ScanLine[y];
line1 = (rgb*)bitmap->ScanLine[y-1];
line2 = (rgb*)bitmap->ScanLine[y+1];
for(int x = 1; x < bitmap->Width; x++)
{
line[x].R = (line[x+1].R + line[x].R + line[x-1].R + line1[x].R + line2[x].R) / 5;
line[x].G = (line[x+1].G + line[x].G + line[x-1].G + line1[x].G + line2[x].G) / 5;
line[x].B = (line[x+1].B + line[x].B + line[x-1].B + line1[x].B + line2[x].B) / 5;
}
}
}
Применив эту процедуру к картинке, компонента TImage мы увидим совершенно другой результат, нежели раньше. Резкость картинки уменьшилась, картинка стала более мягкой и воспринимать такое изображение несколько проще.
Результат работы процедуры.
О плюсах и минусах этого способа
Достоинства
— Не нужно устанавливать сторонних компонентов в среду
— Возможность изменения алгоритма сглаживания «под себя»
Недостатки
— Низкая скорость работы с большими изображениями
Итоги
Был придуман способ реализации сглаживания изображения для компонента TImage, да и не только для него. Этот способ можно применять абсолютно для любых компонентов, включая и сами формы. Существенным недостатком данного способа является низкая скорость работы с изображениями большого размера. Но этот способ всё же изначально рассчитывался на изображения не большого формата.
СОЗДАНИЕ МАТЕРИАЛА ХРОМ ПОД ВИЗУАЛИЗАЦИЮ DEFAULT SCANLINE RENDER И MENTALRAY
Существует достаточно простой и действенный способ создать материал хром в 3dmax. Для этого лучше всего использовать прием искусственного окружения.
При этом можно брать как какую-нибудь конкретную фотографию окружения, так и прописать абстрактное изображение с диффузными разводами. Например, можно самим нарисовать в Photoshop нечто подобное:
Теперь как создается материал:
Берем слот, оставляем тип материала Standart, в канале Reflection (отражение) прописываем карту Raytrace (трассировка):
В настройках карты в опции Background (фон) нужно нажать на кнопку None и прописать туда карту Bitmap:
И выбрать желаемое изображение.
В слоте отобразилось картинка отражения. Но теперь нужно настроить остальные параметры хрома – придать ему зеркальный блеск металла. Для этого сначала настроим блик, например, поставим такие параметры:
Specular level =63
Glossiness =21
Soften =0. 5
Цвет Diffuse нужно сделать темно-серым, почти черным. Чем светлее будет этот серый оттенок, тем большей способностью к рассеиванию света будет обладать материал – тем заметней будет его подсветка отраженным светом. Возьмем серый оттенок со значением в районе 40:
Теперь посчитаем картинку:
Пока по умолчанию отсутствует спад отражения, то есть в свитке Attenuation (затухание) стоит тип Off (выключенный).
Картина значительно меняется при выборе других видов, так например, вот что будет, если поставить следующий тип Linear (линейное):
А вот что получилось при типе Inverse Square (обратно квадрату):
На мой взгляд – смотрится наиболее реалистично.
Но все же, материал хрома чаще всего – это не абсолютное зеркало, поэтому отражение в нем необходимо чуть-чуть приглушить. Для этого нужно воспользоваться настройками карты Bitmap: в свитке Output (на выходе):
Обычно для хрома оптимально значение параметра Output Amount в районе от 0.6 до 0.8:
вот что получилось при значении 0.8:
Чем ниже значение, тем слабее будет видна прописанная картинка отражения, именно картинка, а не окружающие объекты, для того чтобы ослабить у хрома еще и отражение объектов сцены, необходимо убавить силу канала Reflection, например до 80 или 70:
В итоге получится вот так:
Думаю, теперь вы всегда сможете настроить этот материал в зависимости от вашей задачи. В заключение, еще момент: как и в большинстве случаев, здесь желательно использовать бесшовные картинки или подбирать картинки, где изображение для отражения удачно ляжет. Важно также учитывать саму форму объектов: не на всех поверхностях, особенно плоских, материал, созданный таким способом, ложится корректно.
О растровых изображениях — приложения Win32
Редактировать
Твиттер LinkedIn Фейсбук Эл. адрес
- Статья
- 3 минуты на чтение
Растровое изображение — это один из объектов GDI, который можно выбрать в контексте устройства (DC). Контексты устройства — это структуры, определяющие набор графических объектов и связанных с ними атрибутов, а также графические режимы, влияющие на вывод. В таблице ниже описаны объекты GDI, которые можно выбрать в контексте устройства.
Графический объект | Описание |
---|---|
Растровые изображения | Создает изображения, манипулирует ими (масштабирует, прокручивает, поворачивает и рисует) и сохраняет изображения в виде файлов на диске. |
Щетки | Красит внутреннюю часть многоугольников, эллипсов и путей. |
Шрифты | Рисует текст на видеодисплеях и других устройствах вывода. |
Логическая палитра | Цветовая палитра, созданная приложением и связанная с данным контекстом устройства. |
Пути | Одна или несколько фигур (или фигур), заполненных заливкой и/или обведенных контуром. |
Ручки | Графический инструмент, используемый приложением для рисования линий и кривых. |
Регионы |
С точки зрения разработчика, растровое изображение состоит из набора структур, которые определяют или содержат следующие элементы:
- Заголовок, описывающий разрешение устройства, на котором был создан прямоугольник пикселей, размеры прямоугольника , размер массива битов и так далее.
- Логическая палитра.
- Массив битов, определяющий взаимосвязь между пикселями растрового изображения и элементами логической палитры. 98 = 256).
Приложения панели управления являются примерами приложений, использующих растровые изображения. Когда вы выбираете фон (или обои) для своего рабочего стола, вы фактически выбираете растровое изображение, которое система использует для рисования фона рабочего стола. Система создает выбранный фоновый узор, многократно рисуя узор размером 32 на 32 пикселя на рабочем столе.
На следующем рисунке показана точка зрения разработчика на растровое изображение, найденное в файле Redbrick. bmp. Он показывает массив палитры, прямоугольник размером 32 на 32 пикселя и массив индексов, который сопоставляет цвета из палитры с пикселями в прямоугольнике.
В предыдущем примере прямоугольник пикселей был создан на устройстве отображения VGA с использованием палитры из 16 цветов. Для 16-цветной палитры требуются 4-битные индексы; поэтому массив, отображающий цвета палитры на цвета пикселей, также состоит из 4-битных индексов. (Дополнительную информацию о логических цветовых палитрах см. в разделе Цвета.)
Примечание
В приведенном выше растровом изображении система сопоставляет индексы с пикселями, начиная с нижней строки сканирования прямоугольной области и заканчивая верхней строкой сканирования. А строка развертки — это один ряд смежных пикселей на видеодисплее. Например, первая строка массива (строка 0) соответствует нижней строке пикселей, строке развертки 31. Это связано с тем, что приведенное выше растровое изображение является восходящим, независимым от устройства растровым изображением (DIB), распространенным типом растрового изображения. В нисходящих DIB и в растровых изображениях, зависящих от устройства (DDB), система сопоставляет индексы с пикселями, начиная с верхней строки сканирования.
В следующих разделах описываются различные области растровых изображений.
- Классификация растровых изображений
- Типы растровых заголовков
- Расширения JPEG и PNG для определенных функций и структур растровых изображений
- Растровые изображения, контексты устройств и поверхности рисования
- Создание растрового изображения
- Поворот растрового изображения
- Масштабирование растрового изображения
- Растровые изображения как кисти
- Хранилище растровых изображений
- Сжатие растрового изображения
- Альфа-смешение
- Гладкая заливка
- Функции растрового изображения с поддержкой ICM
Функции формата изображения и макросы Руководство по программированию Xlib
: функции формата изображения и макросы Приложения необходимы для представления данных на X-сервер. в формате, который требует сервер. Чтобы упростить приложения, большая часть работы, необходимой для преобразования данных, выполняется Xlib. (см. «Передача изображений между клиентом и сервером» и «Управление изображениями»).структура typedef { внутренняя глубина; число бит_на_пиксель; интервал сканированияline_pad; } XPixmapFormatValues;
XListPixmapFormats
Чтобы получить информацию о формате растрового изображения для данного дисплея, используйте XListPixmapFormats() .XPixmapFormatValues *XListPixmapFormats( display , count_return ) Дисплей * дисплей ; интервал * count_return ;
дисплей Указывает подключение к X-серверу. count_return Возвращает количество форматов растрового изображения, поддерживаемых дисплеем. XListPixmapFormats() функция возвращает массив XPixmapFormatValues структуры, которые описывают поддерживаемые типы изображений формата Z по указанному дисплею. Если памяти недостаточно, XListPixmapFormats возвращает NULL. Чтобы освободить выделенное хранилище для XPixmapFormatValues конструкции, использование XFree() .
Ниже перечислены макросы языка C, их соответствующие функциональные эквиваленты, которые предназначены для других языковых привязок, и какие данные они оба возвращают для указанного сервера и экрана. Они часто используются наборами инструментов, а также простыми приложениями.
ImageByteOrder
ImageByteOrder ( дисплей ) интервал XImageByteOrder( дисплей ) Дисплей * дисплей ;
дисплей Указывает подключение к X-серверу. Оба определяют требуемый порядок байтов для изображений для каждой единицы строки сканирования в Формат XY (растровое изображение) или для каждого значения пикселя в формат Z. Макрос или функция может возвращать либо LSBПервый или MSBFirst .
BitmapUnit
BitmapUnit( отображение ) int XBitmapUnit ( отображение ) Дисплей * дисплей ;
дисплей Указывает подключение к X-серверу. Оба возвращают размер единицы строки растрового изображения в битах. Строка сканирования рассчитывается кратно этому значению.
BitmapBitOrder
BitmapBitOrder ( отображение ) int XBitmapBitOrder ( отображение ) Дисплей * дисплей ;
дисплей Указывает подключение к X-серверу. В каждом блоке растрового изображения отображается крайний левый бит растрового изображения. на экране является либо младшим, либо старшим битом в единица. Этот макрос или функция может возвращать LSBПервый или MSBFirst .
BitmapPad
BitmapPad ( дисплей ) int XBitmapPad( отображение ) Дисплей * дисплей ;
дисплей Указывает подключение к X-серверу. Каждая строка сканирования должна быть дополнена кратным возвращаемым битам. этим макросом или функцией.
Высота дисплея
DisplayHeight ( дисплей , screen_number ) int XDisplayHeight ( дисплей , screen_number ) Дисплей * дисплей ; интервал screen_number ;
Оба возвращают целое число, описывающее высоту экрана. в пикселях.дисплей Указывает подключение к X-серверу. screen_number Задает соответствующий номер экрана на хост-сервере. DisplayHeightMM
DisplayHeightMM ( дисплей , screen_number ) интервал XDisplayHeightMM( дисплей , screen_number ) Дисплей * дисплей ; int screen_number ;
дисплей Указывает подключение к X-серверу. screen_number Задает соответствующий номер экрана на хост-сервере. Оба возвращают высоту указанного экрана в миллиметрах.
Ширина дисплея
DisplayWidth( display , screen_number ) int XDisplayWidth ( дисплей , screen_number ) Дисплей * дисплей ; int screen_number ;
дисплей Указывает подключение к X-серверу. screen_number Задает соответствующий номер экрана на хост-сервере. Оба возвращают ширину экрана в пикселях.
DisplayWidthMM
DisplayWidthMM( display , screen_number ) int XDisplayWidthMM ( дисплей , screen_number ) Дисплей * дисплей ; int screen_number ;
дисплей Указывает подключение к X-серверу.