Сообщение Re: Быстрый алгоритм StretchBlt от 02.06.2017 16:42
Изменено 02.06.2017 16:45 X512
Re: Быстрый алгоритм StretchBlt
Здравствуйте, a9000, Вы писали:
A>Подскажите реализацию алгоритма растягивания и сжатия изображений в памяти на С/С++.
Можно например так:
Только целочисленные операции, умножение и деление в цикле не используется. Основная идея в использовании дробей с общим знаменателем.
stride означает сколько нужно прибавить к указателю colors, чтобы перейти с следующей строке, для обычного двухмерного массива равен width. Цвета 32-х битные.
A>Подскажите реализацию алгоритма растягивания и сжатия изображений в памяти на С/С++.
Можно например так:
void Resize (RasBuf dst, RasBuf src)
{
int len;
int cx, cy;
int bx, dx, dbx;
int by, dy, dby;
if (
(dst.width > 0) && (dst.height > 0) &&
(src.width > 0) && (src.height > 0)
) {
cx = dst.width;
cy = dst.height;
dx = src.width /cx ; dbx = src.width %cx;
dy = src.stride*(src.height/cy); dby = src.height%cy;
for (by = 0; dst.height > 0; dst.height--) {
for (bx = 0, len = dst.width; len > 0; len--) {
*dst.colors = *src.colors;
src.colors += dx; bx += dbx; if (bx >= cx) {src.colors++; bx -= cx;}
dst.colors++;
}
src.colors += dy - src.width;
by += dby; if (by >= cy) {src.colors += src.stride; by -= cy;}
dst.colors += dst.stride - dst.width;
}
}
}Только целочисленные операции, умножение и деление в цикле не используется. Основная идея в использовании дробей с общим знаменателем.
stride означает сколько нужно прибавить к указателю colors, чтобы перейти с следующей строке, для обычного двухмерного массива равен width. Цвета 32-х битные.
Re: Быстрый алгоритм StretchBlt
Здравствуйте, a9000, Вы писали:
A>Подскажите реализацию алгоритма растягивания и сжатия изображений в памяти на С/С++.
Можно например так:
Только целочисленные операции, умножение и деление в цикле не используется. Основная идея в использовании дробей с общим знаменателем.
stride означает сколько нужно прибавить к указателю colors, чтобы перейти с следующей строке, для обычного двухмерного массива равен width. Цвета 32-х битные.
A>Подскажите реализацию алгоритма растягивания и сжатия изображений в памяти на С/С++.
Можно например так:
typedef struct {
int *colors;
int stride, width, height;
} RasBuf;
void Resize (RasBuf dst, RasBuf src)
{
int len;
int cx, cy;
int bx, dx, dbx;
int by, dy, dby;
if (
(dst.width > 0) && (dst.height > 0) &&
(src.width > 0) && (src.height > 0)
) {
cx = dst.width;
cy = dst.height;
dx = src.width /cx ; dbx = src.width %cx;
dy = src.stride*(src.height/cy); dby = src.height%cy;
for (by = 0; dst.height > 0; dst.height--) {
for (bx = 0, len = dst.width; len > 0; len--) {
*dst.colors = *src.colors;
src.colors += dx; bx += dbx; if (bx >= cx) {src.colors++; bx -= cx;}
dst.colors++;
}
src.colors += dy - src.width;
by += dby; if (by >= cy) {src.colors += src.stride; by -= cy;}
dst.colors += dst.stride - dst.width;
}
}
}Только целочисленные операции, умножение и деление в цикле не используется. Основная идея в использовании дробей с общим знаменателем.
stride означает сколько нужно прибавить к указателю colors, чтобы перейти с следующей строке, для обычного двухмерного массива равен width. Цвета 32-х битные.