abandoned bytes
Engineering: the art of making what you want from things you can get.

Algorithmus zum Bild-verkleinern

19. Juni 2009

Vor kurzem brauchte mein Vater einen Bildverkleinerungs-Algorithmus für eine Anwendung (ja, er ist Softwareentwickler). Man würde annehmen, dass es eine große Auswahl an Resize-Bibliotheken zum Ändern der Bildgröße gibt, da es ja auch eine Menge Algorithmen wie Bilinear, Bikubisch etc. gibt. Jede Menge Googeln führt jedoch zu einem anderen Bild. Es gibt durchaus einige Bibliotheken, jedoch mit enormen Abhängigkeiten, eine braucht sogar die komplette GTK+ Bibliothek als Abhängigkeit!

Das Projekt meines Vaters wird in Borland C++ Builder entwickelt (iiek!). Das Borland-Toolkit selbst bietet außer dem "nearest neighbor" (nächster Nachbar)-Algorithmus keine weiteren Algorithmen zur Bildverkleinerung, und dieser sieht sehr schlecht aus (pixelig). Nachdem mir das Googeln zu blöd wurde, habe ich daher eine kleine Funktion zum Bildverkleinern geschrieben, welcher nichts außer einen C++ Compiler braucht. Ich habe mir eigene Überlegungen bezüglich des Algorithmus gemacht, am nächsten kommt er jedoch an die Bilineare Filterung heran (ich mag übrigens keine mathematischen Beschreibungen auf Wikipedia. Ich bin eher ein Programmierer als ein Mathematiker!)

Die Verkleinerung wird selbsterklärend von der Funktion scale() gemacht. Dieser Code ist bereits eine optimierte Version, die leider auch Makros beinhaltet und nicht besonders gut zu lesen ist. Ich schlage vor, die Funktion einfach zu benutzen ;-) Man könnte mich ja auch nerven, eine schönere Version zu schreiben.

readpng() und die PNG Library werden nur benutzt, um ein Beispielbild einzulesen, was sowieso durch eine andere Art der Pixelbeschaffung ersetzt wird. Update: Eine Version mit BMP als Inputfile ist nun im Archiv vorhanden.

Derzeit wird nur die Verkleinerung von Bildern unterstützt. Eine Vergrößerung um einige % scheint allerdings auch kein Problem zu sein.

Update: Scheinbar benötigt man ab libpng 1.4 folgendes:

#define png_infopp_NULL (png_infopp)NULL #define png_voidp_NULL (png_voidp)NULL

Update 2: Bei manchen komprimierten PNGs wurden die Pixeldaten nicht korrekt berechnet - dieser Fehler ist nun ausgebessert.

Download: scaledown.zip

Zuletzt geändert: 18. Juni 2010

Kommentare

johann, 20. April 2010:

For correct downscaling you need some kind of low pass filtering done before interpolation. Please look at: http://www.xs4all.nl/%7Ebvdwolf/main/foto/down_sample/down_sample.htm

David Madl, 20. April 2010:

Hi Johann,

thanks for the feedback! The artifacts are very interesting. My code is only used for scaling a GUI (for which probably better methods exist, but what the heck), thus artifacts of this kind are no problem.

Kommentar schreiben

Die Felder E-Mail und Website sind optional. Die E-Mail-Adresse wird nicht angezeigt, sondern dient mir nur als Antwortmöglichkeit.

Name:
E-Mail:
Website:

Bitte CAPTCHA ausfüllen, um zu bestätigen, dass Du ein Mensch bist:

© 2009 by David Madl. Impressum | Home (English) | Home (Deutsch) | Processing time: 0.567 s

abandoned bytes (de) > Software > C++ > Bild verkleinern
User:
Pass: