Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Билинейная интерполяция - Пример программы22 января 2011Оглавление: 1. Билинейная интерполяция 2. Билинейная интерполяция в компьютерной графике 3. Пример программы Ниже приведен пример программы билинейной интерполяции изображения, написанный на C Входные параметры:
depth - цветовая глубина
a - указатель на массив пикселей изображения, которое необходимо увеличить
Нумерация элементов
old_w - старая ширина изображения
old_h - старая высота изображения
Выходные параметры:
b - указатель на массив пикселей ресемплированного изображения
Нумерация элементов
new_w - новая ширина изображения
new_h - новая высота изображения
#include <stdio.h>
#include <math.h>
#include <sys/types.h>
/* 15 и 16 бит на пиксел-пиксел занимает ровно 2 байта */
#define PIXEL16 *b + + j)
#define A16_1 *a + + c)
#define A16_2 *a + + c + 1)
#define A16_3 *a +* old_w) + c + 1)
#define A16_4 *a +* old_w) + c)
/* 24 или 32 бит на пиксел-пиксел занимает ровно 4 байта,
* в 32 битном изображении 8 бит отводится на прозрачность */
#define PIXEL32 *b + + j)
#define A32_1 *a + + c)
#define A32_2 *a + + c + 1)
#define A32_3 *a +* old_w) + c + 1)
#define A32_4 *a +* old_w) + c)
int bilinear
{
int i;
int j;
int l;
int c;
float t;
float u;
float tmp;
u_char red, green, blue;
for {
for {
tmp = / * ;
l = floor ;
if {
l = 0;
}else {
if {
l = old_h - 2;
}
}
u = tmp - l;
tmp = / * ;
c = floor;
if {
c = 0;
} else {
if {
c = old_w - 2;
}
}
t = tmp - c;
/* По 5 бит на каждый цвет */
if {
/* Red color */
red = * * + t * * + t * u * + * u * ;
/* Green color */
green = * * & 0x1f) + t * * & 0x1f) +
t * u * & 0x1f) + * u * & 0x1f);
/* Blue color */
blue = * * + t * * + t * u * + * u * ;
/* Full pixel from R G B */
PIXEL16 = | | ;
/* Red 5 бит, Green 6 бит, Blue 5 бит */
} else if {
/* Red color */
red = * * + t * * + t * u * + * u * ;
/* Green color */
green = * * & 0x3f) + t * * & 0x3f) +
t * u * & 0x3f) + * u * & 0x3f);
/* Blue color */
blue = * * + t * * + t * u * + * u * ;
/* Full pixel from R G B */
PIXEL16 = | | ;
} else if {
/* Red color */
red = * * + t * * + t * u * + * u * ;
/* Green color */
green = * * & 0xff) + t * * & 0xff) +
t * u * & 0xff) + * u * & 0xff);
/* Blue color */
blue = * * + t * * + t * u * + * u * ;
/* Full pixel from R G B */
PIXEL32 = | | ;
} else {
printf не поддерживается\n", depth);
return -1;
}
}
}
return 0;
}
Просмотров: 13773
|