Я пишу код для масштабирования 32-битного изображения RGBA на C / C ++. Я написал несколько попыток, которые были в некоторой степени успешными, но они медленные и, что наиболее важно, качество изображения не приемлемого размера.
Я сравнил одно и то же изображение, отмасштабированное OpenGL (то есть моей видеокартой), и мою рутину, и оно сильно различается по качеству. Я искал в Google Code, просматривал исходные деревья всего, что, как мне казалось, могло пролить свет (SDL, Allegro, wxWidgets, CxImage, GD, ImageMagick и т. Д.), Но обычно их код либо запутан и разбросан повсюду, либо пронизан ассемблер и почти нет комментариев. Я также прочитал несколько статей в Википедии и других местах, и я просто не нахожу четкого объяснения того, что мне нужно. Я понимаю основные концепции интерполяции и выборки, но изо всех сил пытаюсь понять алгоритм. Я НЕ хочу полагаться на внешнюю библиотеку для одной процедуры и должен конвертировать в их формат изображения и обратно. Кроме того, мне все равно хотелось бы знать, как это сделать самому. :)
Я видел подобный вопрос о переполнении стека и раньше, но на самом деле на него не было дано такого ответа, но я надеюсь, что есть кто-то, кто может помочь подтолкнуть меня в правильном направлении. Может быть, укажите мне какие-нибудь статьи или псевдокод ... что-нибудь, что поможет мне научиться и делать.
Вот что я ищу:
- Нет ассемблера (я пишу очень переносимый код для нескольких типов процессоров).
- Нет зависимости от внешних библиотек.
- Меня в первую очередь интересует масштабирование ВНИЗ, но позже мне нужно будет написать процедуру масштабирования.
- Главное - качество результата и ясность алгоритма (потом смогу оптимизировать).
По сути, мой распорядок выглядит следующим образом:
DrawScaled(uint32 *src, uint32 *dst,
src_x, src_y, src_w, src_h,
dst_x, dst_y, dst_w, dst_h );
Спасибо!
ОБНОВЛЕНИЕ: Чтобы прояснить, мне нужно что-то более продвинутое, чем повторная выборка окна для уменьшения масштаба, которая слишком размывает изображение. Я подозреваю, что мне нужен какой-то бикубический (или другой) фильтр, который в некоторой степени противоположен алгоритму бикубического масштабирования (т.е. каждый целевой пиксель вычисляется из всех исходных пикселей в сочетании с алгоритмом взвешивания, который сохраняет резкость).
Пример
Вот пример того, что я получаю от алгоритма wxWidgets BoxResample по сравнению с тем, что я хочу на растровом изображении 256x256 с масштабированием до 55x55.
- www.free_image_hosting.net/uploads/1a25434e0b.png
И наконец:
- www.free_image_hosting.net/uploads/eec3065e2f.png
исходное изображение 256x256