Здравствуйте, WondeRu, Вы писали:
WR>Здравствуйте, zuv, Вы писали:
zuv>>Если у кого есть киньте в меня алгоритмом изменения размера изображения. Срочно нужно.
WR>Не городим огород, а используем стандартную функцию StretchBlt
Мой опыт применения этой функции показал,что не стоит ей пользоваться.Она сильно искажает изображение.
Здравствуйте, zuv, Вы писали:
zuv>Получается изображение чернобелое и очень плохого качества. В чем ошибка?
В этом: zuv>
zuv> SetStretchBltMode(hDestDC, HALFTONE);
zuv>
After setting the HALFTONE stretching mode, an application must call the SetBrushOrgEx function to set the brush origin. If it fails to do so, brush misalignment occurs.
This option is not supported on Windows 95/98/Me.
Или устанавливать флаг COLORONCOLOR, результат будет похуже, но зато код совместимый.
Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>Здравствуйте, zuv, Вы писали:
zuv>>Получается изображение чернобелое и очень плохого качества. В чем ошибка?
ДМ>В этом: zuv>>
zuv>> SetStretchBltMode(hDestDC, HALFTONE);
zuv>>
ДМ>
ДМ>After setting the HALFTONE stretching mode, an application must call the SetBrushOrgEx function to set the brush origin. If it fails to do so, brush misalignment occurs.
ДМ>This option is not supported on Windows 95/98/Me.
ДМ>Или устанавливать флаг COLORONCOLOR, результат будет похуже, но зато код совместимый.
Установил COLORONCOLOR — не помогло. Картинка получается ужасной по качеству и черно-белой.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, WondeRu, Вы писали:
WR>>Здравствуйте, zuv, Вы писали:
zuv>>>Если у кого есть киньте в меня алгоритмом изменения размера изображения. Срочно нужно.
WR>>Не городим огород, а используем стандартную функцию StretchBlt А>Мой опыт применения этой функции показал,что не стоит ей пользоваться.Она сильно искажает изображение.
Хе, а ты как хотел? . Может я не правильно понял проблему, но по своему опыту могу сказать, что ресайз с дробными коэффициентами (это когда например 5 точек надо превратить в 3 и наоборот) — дело сложное и неблагодарное. И в таких случаях любой алгоритм, заточенный на скорость работы (а именно такой используется в StretchBlt), будет тупым по определению. Сам не пробовал, но думаю, что если тебе нужно качество, тебе прибется делать двумерное фурье-преобразование твоей картинки (что-то типа jpg или png) и потом делать обратное преобразование уже новых размеров. Только так имхо ты сможешь получить более-менее приличное качество ресайза при дробных коэффициентах.
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, zuv, Вы писали:
zuv>>Если у кого есть киньте в меня алгоритмом изменения размера изображения. Срочно нужно.
K>Вот тебе статья с основами: Bicubic Interpolation for Image Scaling
Статья хорошая. А есть еще статьи по данной теме? Очень нуно...
ИМХО не надо. Достаточно просто вычислять цвет по взвешенным коэффициентам
"programmater" <34509@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1238062@news.rsdn.ru...
From: programmater
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, WondeRu, Вы писали:
WR>>Здравствуйте, zuv, Вы писали:
zuv>>>Если у кого есть киньте в меня алгоритмом изменения размера изображения. Срочно нужно.
WR>>Не городим огород, а используем стандартную функцию StretchBlt А>Мой опыт применения этой функции показал,что не стоит ей пользоваться.Она сильно искажает изображение.
Хе, а ты как хотел? . Может я не правильно понял проблему, но по своему опыту могу сказать, что ресайз с дробными коэффициентами (это когда например 5 точек надо превратить в 3 и наоборот) — дело сложное и неблагодарное. И в таких случаях любой алгоритм, заточенный на скорость работы (а именно такой используется в StretchBlt), будет тупым по определению. Сам не пробовал, но думаю, что если тебе нужно качество, тебе прибется делать двумерное фурье-преобразование твоей картинки (что-то типа jpg или png) и потом делать обратное преобразование уже новых размеров. Только так имхо ты сможешь получить более-менее приличное качество ресайза при дробных коэффициентах.
Re[3]: уменьшение/ увеличение зображения Оценить
Здравствуйте, korzhik, Вы писали: K>Вот кстати здесь исходное изображение, чтоб можно было качество заценить
Качество при уменьшении — сукъсь. В том примере используется просто фильтрация "как есть". Это быстро, но много цветовой информации проливается мимо тазика. Для уменьшения с хорошим качеством надо ресамплить, что существенно медленнее. Если взять исходное изображение, и уменьшить его примерно до размеров в предыдущем сообщении, то разница по скорости с- и без ресамплинга будет около 12 раз. Качество вот:
Regular filter:
Resample:
Не надо думать, что первое изображение типа "более четкое". Там действительно не хватает деталей — достаточно посмотреть на ошейник. Например, тонкая горизонтальная линия без ресамплинга может просто исчезнуть.
Здравствуйте, McSeem2, Вы писали:
MS>Там можно выполнять еще и перспективные преобразования, например, из этого баскервильского монстра можно сделать вполне симпатичную таксу MS>
прикольно
кстати это не "баскервильный монстр", а мой милый пёсик Ричард... очень, кстати, добрый
Здравствуйте, McSeem2, Вы писали:
MS>Здравствуйте, Reunion, Вы писали:
R>>Статья хорошая. А есть еще статьи по данной теме? Очень нуно...
MS>Скорее всего страшный баян, но на всякий случай. MS>minorlogic постил отчет о мощном ислледовании фильтров. MS>http://www.rsdn.ru/Forum/Message.aspx?mid=1165444
Баян или не баян, но мимо меня прошел... Там линк на исходники битый. Может у кого есть, вышлите на MS>Еще вот есть сравнение фильтров с формулами: MS>http://www.path.unimelb.edu.au/~dersch/interpolator/interpolator.html
Хотелось бы побольше математики... и исходников...
Спасибо.
Здравствуйте, Reunion, Вы писали:
R>Хотелось бы побольше математики... и исходников... R>Спасибо.
Математика там очень простая. Фильтр представляет собой функцию, симметричную относительно оси OY.
Для сравнения формы фильтров я даже написал специальную дему: http://antigrain.com/demo/image_fltr_graph.zip
Ну или еще вот: http://antigrain.com/demo/image_filters2.zip
Фильтр охватывает некую область, например, линейный фильтр — это +-1 пиксел, итого, 2x2, 4 пиксела. Теоретически, фильтр может быть бесконечным (например, функция Ланкоша), но на практике это не реально, поэтому ограничиваются неким окном, типа 16x16.
Теперь как это работает. Рассмотрим простой линейный фильтр. Его формула y=1-x, симметрично отображенная на отрицательные x. Диапазон x, он же радиус фильтра равен 1. Далее берем координату на исходном изображении с высокой точностью. Если координата попадает в точности на пиксел, то его и берем и больше нас ничего не интересует. Но это — редкий случай. Как правило, мы попадаем как-то типа пиксел +0.3. Это значит, что нам надо взять y=1-0.3 = 0.7 пиксела на который мы попали и остаток = 0.3 — от следующего пиксела. Таким образом, мы суммируем пикселы, попадающие в фильтр, взвесив их на значение этого фильтра. Теперь переходим к двум координатам и перемножаем значения фильтров для X и Y. Линейный фильтр очень наглядно представляется следующим образом. Вот у нас есть сетка из пикселов. Мы берем квадрат равный ячейке сетки и кладем его в произвольное место. В общем случае, наш квадрат перекрывает 4 пиксела. Эти 4 пиксела надо просуммировать с весами, пропорциональными площади перекрытия для каждого пиксела. Площадь перекрытия определяется как dx*dy перекрытия.
Теперь переходим от линейного фильтра к произвольному. Мы просто можем взять не расстояние dx, а значение функции от dx. Кроме того, фильтр сам по себе может иметь и больший радиус, например, классический бикубик охватывает область 4x4 пиксела. Мы просто все это суммируем с соответствующими весами.
Здесь, конечно много "шума", но мне просто лень все это отчищать
Конечно же, фильтр здесь используется не напрямую, а через предварительно вычисленную таблицу (LUT). И все значения — целочисленные, смасштабтрованные на "image_filter_size", что является степенью двойки.
Важное свойство фильтра — баланс сумм значений по пиксельному шагу. Как бы это получше объяснить. В общем, сумма значений с шагом 1 для всего фильтра должна быть 1. Если мы смещаемся на 0.1 пиксела, то сумма значений все равно должна оставаться 1. И так по всему диапазону 0...1. Если это условие не соблюдается, то изображение может темнеть или светлеть в зависимости от того, куда мы попали. Или например, при повороте оно может пойти пятнами. http://www.rsdn.ru/Forum/Message.aspx?mid=1165832&only=1
Другое важное свойство фильтра — если мы хотим, чтобы изображение не размывалось, то в точке 0 фильтр должен иметь значение 1. При этом, чтобы обеспечить предыдущее свойство, то в точках 1,2,3... должно быть значение 0 (для отрицательных X тоже). Не все фильтры этому соответствуют. Например, классический бикубик размывает изображение, даже в случае тождественных преобразований.
Таким образом, вся математика определяется собственно формой фильтра.
Наверное это все очень сумбурно, но просто поздно уже, умственный мозг устал, формулирует плохо
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.