Это усредняет соответствующие пиксели.
w_ratio = src.w / dest.w
h_ratio = src.h / dest.h
dest[x,y] =
AVG( src[x * w_ratio + xi, y * h_ratio + yi] )
where
xi in range (0, w_ratio - 1), inc by 1
yi in range (0, h_ratio - 1), inc by 1
Для граничных условий сделать отдельный цикл (нет, если в цикле).
Вот код, похожий на C:
src и dest - это растровые изображения, которые:
* свойство src [x, y] для пикселя
* свойство src.w для ширины
* свойство src.h для высоты
пиксель был определен так, чтобы
добавление
p1 = p1 + p2
is same as
p1.r = p1.r + p2.r
p1.g = p1.g + p2.g
...
раздел
p1 = p1 / c
p1.r = p1.r / c
p1.g = p1.g / c
оценка с константой 0
p1 = 0
p1.r = 0
p1.g = 0
...
для простоты я не буду рассматривать проблему, когда переполнение целочисленного компонента пикселя ...
float w_ratio = src.w / dest.w;
float h_ratio = src.h / dest.h;
int w_ratio_i = floor(w_ratio);
int h_ratio_i = floor(h_ratio);
wxh = w_ratio*h_ratio;
for (y = 0; y < dest.w; y++)
for (x = 0; x < dest.h; x++){
pixel temp = 0;
int srcx, srcy;
// we have to use here the floating point value w_ratio, h_ratio
// otherwise towards the end it can get a little wrong
// this multiplication can be optimized similarly to Bresenham's line
srcx = floor(x * w_ratio);
srcy = floor(y * h_ratio);
// here we use floored value otherwise it might overflow src bitmap
for(yi = 0; yi < h_ratio_i; yi++)
for(xi = 0; xi < w_ratio_i; xi++)
temp += src[srcx + xi, srcy + yi];
dest[x,y] = temp / wxh;
}
Оптимизация линии Брезенхама