Piszę niektóre kodu do skalowania obrazu RGBA 32-bitowe w C / C ++. Pisałem kilka prób, które zostały nieco udane, ale są powolne i co najważniejsze jakość wielkości obrazu jest nie do przyjęcia.
Porównałem ten sam obraz skalowany przez OpenGL (czyli moja karta graficzna) i mój rutyny i to mil od siebie pod względem jakości. Mam Google Code Szukano, prana drzew źródłowych niczego myślałem byłoby rzucić trochę światła (SDL, Allegro, wxWidgets, CxImage, GD, ImageMagick, itd.), Ale zazwyczaj ich kod jest albo zawiłe i rozrzucone po całym miejscu lub usiane assembler i niewiele lub nie ma żadnych komentarzy. Ja również przeczytać wiele artykułów na Wikipedii i gdzie indziej, a ja po prostu nie znaleźć jasne wyjaśnienie, co muszę. Rozumiem, podstawowe pojęcia interpolacji i pobierania próbek, ale jestem stara się uzyskać prawo algorytmu. Nie chcę polegać na zewnętrznej biblioteki dla jednej rutyny i trzeba konwertować do swojego formatu obrazu i odwrotnie. Poza tym, chciałbym wiedzieć, jak zrobić to sam i tak. :)
Widziałem podobne pytanie zadane na przepełnienie stosu przed, ale to nie było naprawdę odpowiedział w ten sposób, ale mam nadzieję, że ktoś tam, kto może pomóc szturchać mnie we właściwym kierunku. Może wskazać mi niektórych artykułów lub pseudo kod ... nic mi pomóc nauczyć się i wykonać.
Oto, czego szukam:
- Nie assembler (piszę kod bardzo przenośny dla wielu typów procesorów).
- Brak uzależnienia od zewnętrznych bibliotek.
- Jestem zainteresowany głównie ze skalowania w dół, ale będzie też trzeba pisać skali rutynowych później.
- Jakość wyniku i jasności algorytmu jest najważniejsza (mogę zoptymalizować go później).
Moja rutyna zasadniczo przyjmuje następującą postać:
DrawScaled(uint32 *src, uint32 *dst,
src_x, src_y, src_w, src_h,
dst_x, dst_y, dst_w, dst_h );
Dzięki!
UPDATE: W celu wyjaśnienia, że potrzebuję czegoś bardziej zaawansowanego niż resample pole dla zmniejszenia skali, która rozmywa obraz zbyt wiele. Podejrzewam, że to, co chcę jest jakiś bicubic (lub inny), filtr, który jest nieco odwrotne do algorytmu bicubic interpolacji (czyli każdy piksel docelowy jest obliczana ze wszystkich przyczyniających pikseli źródłowych w połączeniu z algorytmem ważenia, który utrzymuje rzeczy ostre.
Przykład
Oto przykład tego, co dostaję od algorytmu wxWidgets BoxResample vs. co chcę na 256x256 bitmapy skalowany do 55x55.
- www.free_image_hosting.net/uploads/1a25434e0b.png
I w końcu:
- www.free_image_hosting.net/uploads/eec3065e2f.png
oryginalny obraz 256x256