Re: Быстрый алгоритм StretchBlt
От: X512 Япония  
Дата: 02.06.17 16:42
Оценка:
Здравствуйте, a9000, Вы писали:

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-х битные.
Отредактировано 02.06.2017 16:45 X512 . Предыдущая версия . Еще …
Отредактировано 02.06.2017 16:44 X512 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.