Здравствуйте Eugeny, 16.04.2001 11:15:09 вы писали:
>Люди помогите с хорошим алгоритмом zoom'а (в моем случае 1-битовое изображение).
По-хорошему это делается так:
1. Берется картинка-результат
2. Для каждой точки ищется соотв. точка в исходной картинке. Если коэф. зуммирования <=1 — это один пиксел, иначе — некоторая область, в этом случае берем ее центральный пиксел.
3. Далее — в зависимости от требуемой скороти и качества: можно просто взять цвет этого пиксела и перенести его на новую картинку, а можно определить маску коэфициентов, типа:
010
121
010
и перемножить цвета пикселей из исходной области с коэфициентами (центр маски совпадает с центром области), а затем найти среднее значение (в случае, если картинка многоцветная — разложить цвет на компоненты и проделать это для каждой). Размер маски может зависеть от размера исходной области. Можно, конечно, сделать ее просто единичной, но так лучше отображаются мелкие детали. Увеличив коэфициенты в столбце — подчеркнешь вертикальные линии на рез. картинке, ну и т.п.
>Если можно с исходником
Сорри, без исходника
>2. Для каждой точки ищется соотв. точка в исходной картинке.
Сорри за навязчивость, это наверно все знают, но все равно напишу :)
Поиск соотв. точки можно осуществлять без чисел с плавающей запятой.
Вообще в случаях, когда float'ы вылазят от деления одного целого на другое,
(а именно этот случай и рассматриваем) существует способ реализовать все
на целых числах (кажись называется алгоритм Брезенхейма, но я не уверен)
Если на пальцах, то надо складывать числители получающихся дробей отдельно,
вообще не производя делений.
Допустим нам надо поставить в соответвие:
x1 меняется 0..width1-1 и x2 меняется 0..width2-1.
вводим переменную t — в ней будем накапливать числители.
x1 = 0 x2 = 0 t = 0
while (x1 < width1)
{
x1++;
t += width2;
while (t > width1)
{
t -= width1;
x2++;
}
}
наглядно и понятно.
конечно по хорошему надо без внутреннего while-а, просто ввести еще две целочисленные переменные — m = целая часть от деления width2 на width1, и n = m * width1 и вместо
внутреннего while поставить
t -= n;
x2 += m;
Здравствуйте Eugeny, вы писали:
E>Люди помогите с хорошим алгоритмом zoom'а (в моем случае 1-битовое изображение). E>Если можно с исходником. Спасибо E>Евгений, britva@nm.ru