Leggere pixel

di il
16 risposte

Leggere pixel

Sono nuovo di c++ e sto cercando di creare un prog che legge un pixel di un immagine e stampa i valori rgb.

Ho visto le librerie libbmp e easybmp ma non trovo una documentazione che spiega come si usano.

Lavoro sotto linux.

16 Risposte

  • Re: Leggere pixel

    Di solito, per questo tipo di ricerche, è utile scrivere in inglese nei motori di ricerca.
    Ad esempio, provando con “c++ easybmp tutorial” ho trovato questo documento:

    https://usermanual.wiki/Pdf/EasyBMPUserManual.1014478550/html

    Trovato anche la pagina di riferimento da cui puoi attingere qualche esempio:

    https://easybmp.sourceforge.net/documentation.html

  • Re: Leggere pixel

    Li avevo visti anche io ma non spiegano niente,  non si potrebbe usare c++ direttamente?

  • Re: Leggere pixel

    Il linguaggio C/C++ non sa come gestire immagini nativamente (anzi, non sifa quasi nulla nativamente).

    Hai la necessità di usare una libreria.

    Fra l'altro non è chiaro se vuoi usare immagini già esistenti a partire dai file o creare immagini da salvare in seguito. E quindi non si sa quali fornati vuoi usare dato che ne esistono tanti. 

    Le librerie che hai visto trattano solo bmp.

  • Re: Leggere pixel

    24/09/2023 - Marchetto ha scritto:


    Li avevo visti anche io ma non spiegano niente,  non si potrebbe usare c++ direttamente?

    Sulla libreria easybmp quello c'è, difficile trovare altro. Inoltre dipende anche dal tuo grado di conoscenza del linguaggio C++.

    Comunque, se vuoi continuare su questa strada (gestire immagini con C++) ti consiglio la libreria SFML: è una libreria multimediale, ben documentata e sempre aggiornata. Qui trovi il sito:

     https://www.sfml-dev.org/index.php

    mentre il tutorial lo trovi qui:

    https://www.sfml-dev.org/tutorials/2.6/

  • Re: Leggere pixel

    Devo usare immagini bmp gia esistenti e la mia conoscenza di c++ è basilare.

  • Re: Leggere pixel

    Ok ma devi provare a scrivere del codice su cui discutere. Cosa ti aspetti?

  • Re: Leggere pixel

    La libreria SFML supporta i seguenti formati: bmp, png, tga, jpg, gif, psd, hdr e pic. Quindi vedi tu.

    In ogni caso, tornando alla easybmp, c'è un bell'esempio al paragrafo 2 del manuale che ti ho segnalato e che tu dici “non spiegano niente”:

    #include "EasyBMP.h"
    using namespace std;
    int main( int argc, char* argv[] )
    {
       if( argc != 3 )
       {
          cout << "Usage: ColorBMPtoGrayscale <input_filename> <output_filename>" << endl << endl;
          return 1;
       }
       // declare and read the bitmap
       BMP Input;
       Input.ReadFromFile( argv[1] );
       // convert each pixel to grayscale using RGB->YUV
       for( int j=0 ; j < Input.TellHeight() ; j++)
       {
          for( int i=0 ; i < Input.TellWidth() ; i++)
          {
             int Temp = (int) floor( 0.299*Input(i,j)->Red + 0.587*Input(i,j)->Green + 0.114*Input(i,j)->Blue );
             ebmpBYTE TempBYTE = (ebmpBYTE) Temp;
             Input(i,j)->Red = TempBYTE;
             Input(i,j)->Green = TempBYTE;
             Input(i,j)->Blue = TempBYTE;
          }
       }
       // Create a grayscale color table if necessary
       if( Input.TellBitDepth() < 16 )
       { CreateGrayscaleColorTable( Input ); }
       // write the output file
       Input.WriteToFile( argv[2] );
       return 0;
    }

    Se non riesci a capirne il contenuto il problema è alla base delle tue conoscenze di C++. Per fare grafica con il C++ bisognerebbe prima aver imparato a programmare in C++. E dato che questo linguaggio non è tra i più semplici disponibili (e @migliorabile direbbe che è difficile da padroneggiare anche per i più esperti) forse stai sbagliando linguaggio.

  • Re: Leggere pixel

    Si in effetti seleziona un pixel ed estrae i valori rgb non l' avevo capito grazie farò più attenzione la prossima volta.

  • Re: Leggere pixel

    Ora ci stò provando con imagemagick ma non mi prende la riga di comando

    #include <cstdio>
    #include <string>
    #include "colo.hpp"
    #include <iostream> 
    using namespace std;
    
    string shap() {
                   int r, c; string pix[10][10], shap[10][10];
                   
                   for (r = 0; r <= 9; r++) {
                                             for (c = 0; c <= 9; c++) {
                                                                       string imm = "convert input.bmp[" + r + "x" + c + "+0+0] -format '%[fx:int(255*r)],%[fx:int(255*g)],%[fx:int(255*b)]' info:";
                                                                       cout << system(imm);
                                                                       //cout << pix[r][c] << " ";
                                                                       //if (c == 0) {shap[r][0] = pix[r][c]; shap[r][1] = to_string(c);}
                                                                       //if (pix[r][c] == shap[r][0]) {shap[r][2] = to_string(c);}
                                                                       }
                                             cout << endl;
                                             }                          
                   cout << endl;
                  /* for (r = 0; r <= 9; r++) {
                                             cout << shap[r][0] << shap[r][1] << shap[r][2] << endl;
                      
                                             }*/
                   return "0";
                   }
    In file included from reco.cpp:2:
    shap.hpp: In function ‘std::string shap()’:
    shap.hpp:12:106: error: invalid operands of types ‘const char*’ and ‘const char [2]’ to binary ‘operator+’
       12 |                                                                    string imm = "convert input.bmp[" + r + "x" + c + "+0+0] -format '%[fx:int(255*r)],%[fx:int(255*g)],%[fx:int(255*b)]' info:";
          |                                                                                 ~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~
          |                                                                                                      |     |
          |                                                                                                      |     const char [2]
          |                                                                                                      const char*
    In file included from reco.cpp:2:
    shap.hpp:13:83: error: cannot convert ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} to ‘const char*’
       13 |                                                                    cout << system(imm);
          |                                                                                   ^~~
          |                                                                                   |
          |                                                                                   std::string {aka std::__cxx11::basic_string<char>}
    In file included from /usr/include/c++/11.2.0/cstdlib:75,
                     from /usr/include/c++/11.2.0/ext/string_conversions.h:41,
                     from /usr/include/c++/11.2.0/bits/basic_string.h:6607,
                     from /usr/include/c++/11.2.0/string:55,
                     from shap.hpp:2,
                     from reco.cpp:2:
    /usr/include/stdlib.h:784:32: note:   initializing argument 1 of ‘int system(const char*)’
      784 | extern int system (const char *__command) __wur;
          |  
  • Re: Leggere pixel

    Secondo te è corretto concatenare con +:delle stringhe e delle variabili intere?

  • Re: Leggere pixel

    Ho letto no ma non sò come fare, devo fare il casting a string?

  • Re: Leggere pixel

    Avevo provato a fare il casting ma ottengo questo

                                                                       string imm = "convert input.bmp[" + std::to_string(r) + "x" + std::to_string(c) + "+0+0] -format '%[fx:int(255*r)],%[fx:int(255*g)],%[fx:int(255*b)]' info:";
    In file included from reco.cpp:2:
    shap.hpp: In function ‘std::string shap()’:
    shap.hpp:13:83: error: cannot convert ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} to ‘const char*’
       13 |                                                                    cout << system(imm);
          |                                                                                   ^~~
          |                                                                                   |
          |                                                                                   std::string {aka std::__cxx11::basic_string<char>}
    In file included from /usr/include/c++/11.2.0/cstdlib:75,
                     from /usr/include/c++/11.2.0/ext/string_conversions.h:41,
                     from /usr/include/c++/11.2.0/bits/basic_string.h:6607,
                     from /usr/include/c++/11.2.0/string:55,
                     from shap.hpp:2,
                     from reco.cpp:2:
    /usr/include/stdlib.h:784:32: note:   initializing argument 1 of ‘int system(const char*)’
      784 | extern int system (const char *__command) __wur;
          |   
  • Re: Leggere pixel

    Ho risolto con

    const char* command = imm.c_str();
    cout << system(command);
  • Re: Leggere pixel

    Questo risolve il problema alla linea 13 ma non alla 12 di cui nonnhai detto nulla

Devi accedere o registrarti per scrivere nel forum
16 risposte