Растровая Графика

В: Основные структуры данных 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 Градаций Серогомедицина
16bppRgb555True Color216 = 65.536низко качественные снимки
24bppRgbTrue Color224 = 16.777.216Цифровые Камеры
32bppArgbTrue Color224 + 256 градаций прозрачностиВиртуальная Реальность
64bppArgbTrue Color248 + 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 растрового Изображения zoomxzoomy  (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 );
  }
}