Быстрый метод масштабирования цветных изображений
Нет необходимости рассчитывать индикатор конечного пикселя, так как алгоритм разработан так, что процесс представляет собой цикл обработок увеличенных пикселей вместо обработки пикселей самого источника; кроме того, просматриваемое изображение может быть меньше увеличенного из-за обрезки границ. Каждый увеличенный пиксель получается из четырёх усреднённых пикселей источника (как в билинейной интерполяции). Алгоритм сканирует сразу 2 строки источника, используя фильтр 2*2 для расчёта интерполированных пикселей. Масштабирование может быть осуществлено отдельно по горизонтали и вертикали во время сканирования строк источника. Индексы и веса по горизонтали рассчитываются по формулам
где 0 < x < destination_image_size.
Индикатор равен 1, если значение очередного интерполированного пикселя получается из очередной пары пикселей источника (т. е. центр очередного интерполированного пикселя расположен справа от центра правого пикселя текущей пары пикселей источника) и 0 в противном случае.
Приведённые выше формулы используются и для расчёта индексов и весов по вертикали.
Веса и индексы являются целыми числами. В нашем примере использована 10-битная точность как пример перевода вещественных чисел в целые. Заметим, что когда центр пикселя приёмника расположен слева или выше центра первого пикселя источника (start + x/zoom_factor < 0), алгоритму не хватает левых (верхних) пикселей для расчёта весов. Только первый пиксель источника используется для вычисления левого (верхнего) веса, а правый (нижний) вес полагается равным 0. Если же центр пикселя приёмника расположен справа или ниже центра последнего пикселя источника (input_image_size – 1 < start_pixel + x/zoom_factor), алгоритму не хватает правого (или нижнего) пикселя источника для расчёта весов. Последний пиксель источника используется для расчёта левого (или верхнего) веса, а правый (нижний) полагается равным 0.
Когда строка изображения полностью обработана по ширине, увеличенные пиксели делением на 1024 переводятся в 8-разрядные числа (0…255) и записываются в выходной буфер.
Применение таблиц снижает вычислительную сложность. Для увеличения масштаба изображения используется 2 строки источника и 1 строка приёмника. Дополнительно в памяти хранятся 2 вектора индексов пикселей (по одному на обработку изображения по ширине и высоте), а также 4 весовых вектора (2 на ширину и 2 на высоту). Отсюда видно, что предлагаемый метод не требует больших объёмов памяти и эффективен с вычислительной точки зрения, следовательно, идеален для мобильных устройств.
Панорамирование и обрезка границ.
Когда рисунок отображается в 100%-м масштабе (1:1), один пиксель источника соответствует одному пикселю экранного изображения. В этом случае источник обрезается до соответствующих размеров (если это необходимо), а вместо коэффициента масштаба следует учитывать позицию панорамирования.
Алгоритм начинается с вычисления первого и последнего пикселей в обоих направлениях (горизонтальном и вертикальном):
Обработка в таком случае заключается в выборе необходимого количества пикселей источника и их копировании в приёмник. Как видим, алгоритм очень быстр – кроме копирования данных в памяти ничего не требуется. А т. к. для обработки нужна только одна строка источника и соответствующая ей строка приёмника, этот способ и в отношении необходимого объёма памяти.