Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] operacje na pojedynczych pikselach zdjęcia

Ostatnio zmodyfikowano 2019-04-12 21:41
Autor Wiadomość
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?
P-174356
pekfos
» 2019-04-09 11:08:06
P-174358
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?
C/C++
#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; /////////////////////////////////////// TU ZMIENIĘ
    for( int i = 1; i < 2127; i += 2 )
    for( int j = 1; j < 1410; j += 2 )
    {
        pix00 = image1.getPixel( i - 1, j - 1 ); //////////////////////////// TU ZMIENIĘ
        pix01 = image1.getPixel( i, j - 1 ); /////////////////////////////// TU ZMIENIĘ    
        pix10 = image1.getPixel( i - 1, j ); /////////////////////////////// TU ZMIENIĘ
        pix11 = image1.getPixel( i, j ); /////////////////////////////////// TU ZMIENIĘ      
        bigPixel.r =( pix00.r + pix01.r + pix10.r + pix11.r ) / 4; ///////// TU ZMIENIĘ      
        bigPixel.g =( pix00.g + pix01.g + pix10.g + pix11.g ) / 4; ///////// TU ZMIENIĘ        
        bigPixel.b =( pix00.b + pix01.b + pix10.b + pix11.b ) / 4; ///////// TU ZMIENIĘ        
       
        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?
C/C++
#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; ////////////////////////////////////////////// TU ZMIENIŁEM
    bigPixel.r = 0; ////////////////////////////////////////////////////////////// TU ZMIENIŁEM
    bigPixel.g = 0; ////////////////////////////////////////////////////////////// TU ZMIENIŁEM
    bigPixel.b = 0; ////////////////////////////////////////////////////////////// TU ZMIENIŁEM
    for( int i = 1; i < 2127; i += 2 )
    for( int j = 1; j < 1410; j += 2 )
    {
        for( int k = 0; k < 4; k++ ) { /////////////////////////////// TU ZMIENIŁEM 
            smallPixel = image1.getPixel( i -( k % 2 ), j -( k / 2 ) ); ///// TU ZMIENIŁEM
            bigPixel.r += smallPixel.r / 4; //////////////////////// TU ZMIENIŁEM  
            bigPixel.g += smallPixel.g / 4; //////////////////////// TU ZMIENIŁEM   
            bigPixel.b += smallPixel.b / 4; //////////////////////// TU ZMIENIŁEM
        } /////////////////////////////////////////////////////////// TU ZMIENIŁEM 
       
        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...
P-174380
pekfos
» 2019-04-12 21:41:33
Sumujesz wartości do zmiennej, której nie zerujesz.
P-174381
« 1 »
  Strona 1 z 1