Билинейная интерполяция: различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
м Перемещение 8 интервики-ссылок в Викиданные (d:Q612143)
Строка 79:
== Пример программы ==
 
Ниже приведен пример программы билинейной интерполяции изображения, написанный на [[Си (язык программирования)C99|CC99]](на C89 компилироваться не будет!)
 
Входные параметры:
Строка 99:
#include <sys/types.h>
 
 
void resample(voidint *aoldw, voidint *boldh, int oldwneww, int oldhnewh, intu_int newwa[oldh][oldw], u_int int b[newh][neww])
{
int i, j;
int jh, w;
int l;
int c;
float t;
float u;
float tmp;
float d1, d2, d3, d4;
u_int p1, p2, p3, p4; /* Окрестные пикселы */
{
u_char red, green, blue;
 
for (ij = 0; ij < newh; ij++) {
tmp = (float) (ij) / (float) (newh - 1) * (oldh - 1);
{
h = (int) for floor(j = 0tmp); j < neww; j++)
if (h < 0) {
h = 0;
} else {
if (lh >= oldh - 1) {
lh = oldh - 2;
}
}
u = tmp - lh;
 
for (i = 0; i < neww; i++) {
tmp = (float) (i) / (float) (newh - 1) * (oldh - 1);
l = (int) floor(tmp);
if (l < 0)
{
l = 0;
}
else
{
if (l >= oldh - 1)
{
l = oldh - 2;
}
}
u = tmp - l;
 
tmp = (float) (ji) / (float) (neww - 1) * (oldw - 1);
cw = (int) floor(tmp);
if (cw < 0) {
w = 0;
{
} else c = 0;{
if (w >= oldw - 1) }{
w = oldw - else2;
}
{
}
if (c >= oldw - 1)
t = tmp - {w;
c = oldw - 2;
}
}
t = tmp - c;
 
/* Коэффициенты */
d1 = (1 - t) * (1 - u);
d2 = t * (1 - u);
d3 = t * u;
d4 = (1 - t) * u;
 
/* Окрестные пиксели: a[i][j] */
p1 = *((u_int*)a + (l * oldw) + c)[h][w];
p2 = *((u_int*)a + (l * oldw) + c[h][w + 1)];
p3 = *((u_int*)a + ((l[h + 1)* oldw) + c][w + 1)];
p4 = *((u_int*)a + ((l[h + 1)* oldw) + c)][w];
 
/* Компоненты */
blue = (u_char) p1 * d1 + (u_char) p2 * d2 + (u_char) p3 * d3 + (u_char) p4 * d4;
green = (u_char) (p1 >> 8) * d1 + (u_char) (p2 >> 8) * d2 + (u_char) (p3 >> 8) * d3 + (u_char) (p4 >> 8) * d4;
red = (u_char) (p1 >> 16) * d1 + (u_char) (p2 >> 16) * d2 + (u_char) (p3 >> 16) * d3 + (u_char) (p4 >> 16) * d4;
 
/* Новый пиксел из R G B */
b[j][i] = *((u_int*u_int32_t)b + (i * neww) + j) = (red << 16) | ((u_int32_t) green << 8) | (blue);
}
}
}
}