Растровая Графика
В: Основные структуры данных a) 2D-Векторной графики и b) 2D-Растровой графики?
О: a) Полигон = упорядоченное множество Точек p[0], p[1], ... p[i] ... p[n-1], где каждая p[i] содержит, как минимум, один float x и один float y. Ни один из отрезков p[i],p[i+1] не должен пересекаться с другим отрезком p[j],p[j+1]. Когда p[0] совпадает с p[n-1], тогда Полигон закрыт, иначе он открыт.
b) Матрица = прямоугольно упорядоченное множество xSize Колонок и ySize Строк.
Индекс Колонок: 0 <= x <= xSize-1, Индекс Срок: 0 <= y <= ySize-1
В: Определение Дискретизации, Квантования, Оцифровки, Бинаризации?
О: Дискретизация = отображение реального мира на четырехугольной сенсорной матрице.
Квантование = отображение аналоговой оси Светлоты в виде упорядоченного множества целых чисел (обычно 0 - 255).
Оцифровка = последовательность операций Дискретизации и Квантования.
Бинаризация = Квантование ровно 2-мя значениями Серого (обычно 0 и 1 или 0 и 255).
В: Первый Пиксел одного Изображения имеет адрес: Byte* p;. Какой линейный адрес имеет Пиксел в строке y и в колонке x?
A: Adresse = p + y * xSize + x
В: Укажите свойства следующих форматов Пикселей:
Формат | Тип Изображения | возможные цвета | Применение |
1bppIndexed | 2 | ||
4bppIndexed | 24 = 16 | ||
8bppIndexed | 28 = 256 | ||
16bppGrayScale | 216 Градаций Серого | ||
16bppRgb555 | 216 = 65.536 | ||
24bppRgb | 224 = 16.777.216 | ||
32bppArgb | 224 + 256 градаций прозрачности | ||
64bppArgb | 248 + 216 градаций прозрачности |
О:
Формат | Тип Изображения | Возможные цвета | Применение |
1bppIndexed | Черно-белое | 2 | Факсы, черно-белые принтеры |
4bppIndexed | Палитровое | 24 = 16 | Иконки |
8bppIndexed | Палитровое | 28 = 256 | игрушки на переносных устройствах |
16bppGrayScale | Градации Серого | 216 Градаций Серого | медицина |
16bppRgb555 | True Color | 216 = 65.536 | низко качественные снимки |
24bppRgb | True Color | 224 = 16.777.216 | Цифровые Камеры |
32bppArgb | True Color | 224 + 256 градаций прозрачности | Виртуальная Реальность |
64bppArgb | True Color | 248 + 216 градаций прозрачности | Спутниковые снимки |
В: Объясните последовательность действий, Когда растровое изображение a) на 10 % увеличивается и b) на 10% уменьшается и когда оно c) в два приема на 10% увеличивается и d) один раз на 20% увеличивается.
О: a) каждая десятая строка будет дублироваться и каждая десятая колонка будет дублироваться, без оглядки на искажения.
b) каждая десятая колонка и строка будут удалены а последующие сроки и колонки будут сдвинуты на их место, без оглядки на потери изображения и искажения.
c) Двойное дублирование ведет к серьезным искажениям. Пример: 0123456789 → 01234567899 → 012345678999
d) Каждая пятая строка и колонка будут продублированы. Пример: 0123456789 → 012344567899
В: Возможности Векторной и Растровой графики
Векторная Графика | Растровая Графика | |
Рисование линий | ||
Заполнение областей | ||
Шрифты | ||
Картинки реального мира |
О:
Векторная Графика | Растровая Графика | |
Рисование линий | идеально, высоко точно | только горизонтальные и вертикальные, остальные - ступенчато |
Заполнение областей | заполнение областей невозможно, только штриховкой | хорошо, но только со ступенчатыми краями |
Шрифты | слишком тонкие, но идеально скалируемые (True Type Font) | хорошо, но каждый растровый шрифт для каждого размера требует дополнительный набор символов |
Картинки реального мира | только контуры и заштрихованные области | хорошо, например ТВ |
В: Полигон p0 будет трансформирован в p1 и одно Растровое Изображение bmp0 в другое bmp1. Каковы основные различия обеих трансформаций?
Полигональная трансформация = Векторные операции - scroll, zoom, rot | Битмап трансформация = Растровые операции scroll, zoom, rot | |
Тип x,y | ||
Ступенчатость | ||
Точность | ||
Направление | ||
Границы | ||
Возвратность | ||
Пошаговость | ||
Перезапись |
О:
Полигональная трансформация = Векторные операции - scroll, zoom, rot | Битмап трансформация = Растровые операции scroll, zoom, rot | |
Тип x,y | все x,y - реальные числа (обычно float) | все x,y - целые числа (обычно int) |
Ступенчатость | без ступеней | только целочисленные Пиксельные шаги |
Точность | всегда высоко точно | всегда ошибка округления |
Направление | Прямая трансформация - трансформируется каждый Пиксел из p0 на p1. | Обратная трансформация из bmp1 на bmp0: ищем для каждого целевого Пиксела из bmp1 один Пиксел из bmp0. |
Границы | нет границ | большая проблема: потери при достижении границ Изображения. |
Возвратность | обратное преобразование без потерь | обратная операция почти никогда невозможна |
Пошаговость | операции свободно каскадируемы | Все операции должны исходить от оригинального bmp0. |
Перезапись | p0 может быть заменен на p1. | bmp0 как правило остается востребованным, т.е. на bmp1 еге менять нельзя! |
В: Scroll растрового Изображения на float dx, float dy (Input: bmp0 → Output: bmp1)
int idx = Convert.ToInt32( dx ); int idy = Convert.ToInt32( dy ); for ( int y1 = ............................ ) { int y0 = .......... if ( y0 < 0 || y0 >= ySize ) continue; for ( int x1 = ............................ ) { int x0 = ............ if ( x0 < 0 || x0 >= xSize ) continue; Color color = bmp0.GetPixel( ...... ); bmp1.SetPixel( .................... ); } } О: int idx = Convert.ToInt32( dx ); int idy = Convert.ToInt32( dy ); for ( int y1 = 0; y1 < bmp1.Height; y1++ ) { int y0 = y1 - idy; if ( y0 < 0 || y0 >= ySize ) continue; for ( int x1 = 0; x1 < bmp1.Width; x1++ ) { int x0 = x1 - idx; if ( x0 < 0 || x0 >= xSize ) continue; Color color = bmp0.GetPixel( x0, y0 ); bmp1.SetPixel( x1, y1, color ); } }
В: Zoom растрового Изображения zoomx, zoomy (Input: bmp0 → Output: bmp1)
for ( int y1 = ............................ ) { int y0 = Convert.ToInt32( .......... ); if ( y0 < 0 || y0 >= ySize ) continue; for ( int x1 = ........................... ) { int x0 = Convert.ToInt32( .......... ); if ( x0 < 0 || x0 >= xSize ) continue; Color color = bmp0.GetPixel( ...... ); bmp1.SetPixel( .................... ); } } О: for ( int y1 = 0; y1 < bmp1.Height; y1++ ) { int y0 = Convert.ToInt32( y1 / zoomy ); if ( y0 < 0 || y0 >= ySize ) continue; for ( int x1 = 0; x1 < bmp1.Width; x1++ ) { int x0 = Convert.ToInt32( x1 / zoomx ); if ( x0 < 0 || x0 >= xSize ) continue; Color color = bmp0.GetPixel( x0, y0 ); bmp1.SetPixel( x1, y1, color ); } }
В: Rotation растрового Изображения на угол alpha по часовой стрелке (Input: bmp0 → Output: bmp1)
double arcus = ................................ float sinus = (float)......................... float cosinus = (float)......................... for ( int y1 = ............................ ) { float y1_sinus = y1 * sinus; float y1_cosinus = y1 * cosinus; for ( int x1 = ............................ ) { int x0 = Convert.ToInt32( ............................... ); if ( x0 < 0 || x0 >= xSize ) continue; int y0 = Convert.ToInt32( ............................... ); if ( y0 < 0 || y0 >= ySize ) continue; Color color = bmp0.GetPixel( ...... ); bmp1.SetPixel( .................... ); } } О: double arcus = alpha * 2 * Math.PI / 360; float sinus = (float)Math.Sin( arcus ); float cosinus = (float)Math.Cos( arcus ); for ( int y1 = 0; y1 < bmp1.Height; y1++ ) { float y1_sinus = y1 * sinus; float y1_cosinus = y1 * cosinus; for ( int x1 = 0; x1 < bmp1.Width; x1++ ) { int x0 = Convert.ToInt32( x1 * cosinus + y1_sinus ); if ( x0 < 0 || x0 >= xSize ) continue; int y0 = Convert.ToInt32( -x1 * sinus + y1_cosinus ); if ( y0 < 0 || y0 >= ySize ) continue; Color color = bmp0.GetPixel( x0, y0 ); bmp1.SetPixel( x1, y1, color ); } }