Я пишу код для масштабирования 32-битного изображения RGBA в C/С++. Я написал несколько попыток, которые были несколько успешными, но они медленны, а главное качество изображения не приемлемо.
Я сравнивал одно и то же изображение, масштабируемое OpenGL (то есть моя видеокарта), и моя рутина, и она была немного отличается качеством. Я искал Google Code, просматривал исходные деревья всего, что, как я думал, прольет свет (SDL, Allegro, wxWidgets, CxImage, GD, ImageMagick и т.д.), Но обычно их код либо запутан и разбросан по всему месту, либо пронизан сборщиком и небольшими комментариями или без комментариев. Я также читал несколько статей в Википедии и в других местах, и я просто не нашел ясного объяснения того, что мне нужно. Я понимаю основные понятия интерполяции и выборки, но я изо всех сил пытаюсь получить алгоритм правильно. Я НЕ хочу полагаться на внешнюю библиотеку для одной подпрограммы и должен конвертировать в свой формат изображения и обратно. Кроме того, я хотел бы знать, как это сделать в любом случае.:)
Я уже видел подобный вопрос, заданный перед переполнением стека, но на него не ответили так, но я надеюсь, что там кто-то есть, кто может помочь подтолкнуть меня в правильном направлении. Возможно, укажите мне некоторые статьи или псевдокод... что-нибудь, что поможет мне учиться и делать.
Вот что я ищу:
- Нет ассемблера (я пишу очень портативный код для нескольких типов процессоров).
- Никаких зависимостей от внешних библиотек.
- В первую очередь я занимаюсь масштабированием DOWN, но также должен будет написать процедуру масштабирования позже.
- Качество результата и ясность алгоритма наиболее важны (я могу его оптимизировать позже).
Моя процедура по существу принимает следующий вид:
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