[SFML] operacje na pojedynczych pikselach zdjęcia
Ostatnio zmodyfikowano 2019-04-12 21:41
Ariess Temat założony przez niniejszego użytkownika |
[SFML] operacje na pojedynczych pikselach zdjęcia » 2019-04-09 10:59:07 Witam. To mój pierwszy post oraz dopiero się uczę programować więc proszę o wyrozumiałość.
Próbuję napisać program, który będzie zmieniał kolor konkretnych pikseli na zdjęciu. Przeczytałem już tutejszy kurs SFML 2.0.
Czy jest jakiś sposób, żeby potraktować zdjęcie jak tablicę pikseli? Czy raczej powinienem stworzyć własną tablicę, wczytać do niej piksele, edytować i nadpisać zdjęcie? Jakie funkcje będą potrzebne? |
|
pekfos |
» 2019-04-09 11:08:06 |
|
Ariess Temat założony przez niniejszego użytkownika |
» 2019-04-12 19:44:31 Dziękuję bardo za odpowiedź. Już wcześniej znalazłem ów link, lecz wiedza, że są w nim odpowiedzi na moje pytania bardzo mi pomogła. Mam kolejny problem w tej tematyce. Próbuję napisać kod który uśrednia kolor 4 sąsiednich pikseli. Po 20 próbach zmieniłem taktykę i zadziałało, jednak nadal nie rozumiem. Czemu ten kod działa? #include <SFML/Graphics.hpp> int main() { sf::Image image1; if( !image1.loadFromFile( "image.png" ) ) return - 1; sf::Image image2; image2.create( 2127, 1410, sf::Color::Black ); sf::Color bigPixel, pix00, pix01, pix10, pix11; for( int i = 1; i < 2127; i += 2 ) for( int j = 1; j < 1410; j += 2 ) { pix00 = image1.getPixel( i - 1, j - 1 ); pix01 = image1.getPixel( i, j - 1 ); pix10 = image1.getPixel( i - 1, j ); pix11 = image1.getPixel( i, j ); bigPixel.r =( pix00.r + pix01.r + pix10.r + pix11.r ) / 4; bigPixel.g =( pix00.g + pix01.g + pix10.g + pix11.g ) / 4; bigPixel.b =( pix00.b + pix01.b + pix10.b + pix11.b ) / 4; for( int k = 0; k < 4; k++ ) image2.setPixel( i -( k % 2 ), j -( k / 2 ), bigPixel ); } if( !image2.saveToFile( "result.png" ) ) std::printf( "error 1" ); return 0; }
A ten nie? #include <SFML/Graphics.hpp> int main() { sf::Image image1; if( !image1.loadFromFile( "image.png" ) ) return - 1; sf::Image image2; image2.create( 2127, 1410, sf::Color::Black ); sf::Color bigPixel, smallPixel; bigPixel.r = 0; bigPixel.g = 0; bigPixel.b = 0; for( int i = 1; i < 2127; i += 2 ) for( int j = 1; j < 1410; j += 2 ) { for( int k = 0; k < 4; k++ ) { smallPixel = image1.getPixel( i -( k % 2 ), j -( k / 2 ) ); bigPixel.r += smallPixel.r / 4; bigPixel.g += smallPixel.g / 4; bigPixel.b += smallPixel.b / 4; } for( int k = 0; k < 4; k++ ) image2.setPixel( i -( k % 2 ), j -( k / 2 ), bigPixel ); } if( !image2.saveToFile( "result.png" ) ) std::printf( "error 1" ); return 0; }
Jak dla mnie efekt powinien być ten sam... |
|
pekfos |
» 2019-04-12 21:41:33 Sumujesz wartości do zmiennej, której nie zerujesz. |
|
« 1 » |