tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
0
ZUGRIFFE
1571
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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ß
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken [QUIZ#14] deepthroat (C++)-annabelle2.converted.jpg  
    Angehängte Dateien Angehängte Dateien
    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.

Thema nicht erledigt

Ähnliche Themen

  1. [QUIZ#3] deepthroat (Haskell)
    Von deepthroat im Forum Archiv
    Antworten: 0
    Letzter Beitrag: 05.10.08, 20:01
  2. [Quiz#1] deepthroat (Haskell)
    Von deepthroat im Forum Archiv
    Antworten: 1
    Letzter Beitrag: 21.09.08, 20:33
  3. [Quiz#1] deepthroat (Prolog)
    Von deepthroat im Forum Archiv
    Antworten: 0
    Letzter Beitrag: 21.09.08, 13:14