ERLEDIGT
NEIN
NEIN
ANTWORTEN
0
0
ZUGRIFFE
1571
1571
EMPFEHLEN
-
27.03.10 23:28 #1
- Registriert seit
- Jun 2005
- Beiträge
- 8.166
Hi.
Ich dachte diesmal mach ich auch mal schnell mit.
Zumindest gab mir diese Aufgabe die Gelegenheit mal etwas mit Boost.GIL zu machen.
Die Datei inklusive einer CMake Konfigurationsdatei ist angehängt. Benötigt wird neben Boost auch noch libpng und zlib. Optional kann auch noch libjpeg zur Verarbeitung von JPEG Dateien verwendet werden.
Beim Algorithmus selbst hab ich mir keine große Mühe gegeben. Das Eingabebild wird in n Teilstücke zerteilt, wobei n ein Vielfaches der Würfelgröße in Pixeln ist (das heißt evtl. wird etwas vom Orignalbild abgeschnitten (es sei denn man verwendet 1x1 Pixel große Würfel
).
Nachdem die Würfel-Sprite-Datei geladen ist, wird das Eingabebild geladen und gleich in 8 Bit Graustufen konvertiert. (intern verwendete Formel: r * 0.3 + g * 0.59 + b * 0.11)
Für jedes Würfel Subimage wird dann ein Helligkeitswert bestimmt indem das arithm. Mittel der Pixel berechnet wird.
Das Ausgabebild setzt sich dann aus den entsprechenden Würfelaugen je Helligkeitswert zusammen und wird in die Datei "original-dateiname"+"converted.png" geschrieben.
Für das Beispiel im Anhang habe ich einen chinesischen Würfel verwendet dessen 1 und 4 rot hervorgehoben sind.
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
clog << "loading wuerfel12.png...\n"; png_read_image("wuerfel_chin12.png", dices); clog << "loading/converting input png...\n"; png_read_and_convert_image(argv[1], input); // applies // RGB // to // luminance // conversion size_t dsize = dices.width(); size_t max_width = input.width() / dsize; size_t max_height = input.height() / dsize; cout << "png size: " << input.width() << ":" << input.height() << endl; rgba8_image_t output(max_width * dsize, max_height * dsize); BOOST_AUTO(outview, view(output)); for (size_t i = 0, e_i = max_width * dsize; i < e_i; i += dsize) { for (size_t j = 0, e_j = max_height * dsize; j < e_j; j += dsize) { using namespace boost::accumulators; BOOST_AUTO(region, subimage_view(const_view(input), i, j, dsize, dsize)); typedef BOOST_TYPEOF(region) region_type; accumulator_set< double, stats<tag::mean> > acc; for (BOOST_AUTO(it, region.begin()); it != region.end(); ++it) { acc(*it); } int face = 5 - static_cast<int>(mean(acc) / 256.0 * 6); clog << face << " "; copy_pixels(subimage_view(const_view(dices), 0, face * dsize, dsize, dsize), subimage_view(outview, i, j, dsize, dsize)); } clog << endl; } png_write_view(fs::path(argv[1]).replace_extension("converted.png").string(), outview);
GrußGeändert von deepthroat (27.03.10 um 23:31 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
[QUIZ#3] deepthroat (Haskell)
Von deepthroat im Forum ArchivAntworten: 0Letzter Beitrag: 05.10.08, 20:01 -
[Quiz#1] deepthroat (Haskell)
Von deepthroat im Forum ArchivAntworten: 1Letzter Beitrag: 21.09.08, 20:33 -
[Quiz#1] deepthroat (Prolog)
Von deepthroat im Forum ArchivAntworten: 0Letzter Beitrag: 21.09.08, 13:14





Login





