C++ Converting a float to an unsigned char?

后端 未结 2 478
时光取名叫无心
时光取名叫无心 2021-02-10 21:24

I\'m new to C++, and doing a bit of googling I thought sprintf would do the job, but I get an error upon compiling that I can\'t convert between an unsigned c

相关标签:
2条回答
  • 2021-02-10 21:49

    I'll guess that the floats are in the range 0.0 ... 1.0, then you do it like this:

    float redf = 0.5f;
    unsigned char reduc = redf * 255;
    

    The variable reduc is now 128.


    EDIT: complete example, outputting image in Net PPM format.

    // Usage 
    //  program > file.ppm
    
    #include <vector>
    #include <iostream>
    
    typedef struct
    {   /* colors in range 0..1 anything else is out of gamut */
        float red, green, blue;
    } color;
    
    using namespace std;
    
    int main ( int argc, char **argv )
    {   
        int width = 10, height = 10;
        vector<color> bitmap; // This should maybe be called floatmap? ;)
    
        // Make an image in memory as a float vector
    
        for( int y = 0; y < height; y++ )
        {   
            for( int x = 0; x < width; x++ )
            {
                color temp;
                temp.red = ((float)x / width);
                temp.green = 0;
                temp.blue = ((float)y / height);
                bitmap.push_back(temp);
            }
        }
    
        // output image as an Netppm pixmap
        cout << "P3" << endl << width << " " << height << endl << 255 << endl;
        for( int y = 0; y < height; y++ )
        {   
            for( int x = 0; x < width; x++ )
            {
                int red, green, blue;
                red = (unsigned char)(bitmap[y*width+x].red * 255);
                green = (unsigned char)(bitmap[y*width+x].green * 255);
                blue = (unsigned char)(bitmap[y*width+x].blue * 255);
                cout << red << " ";
                cout << green << " ";
                cout << blue << " ";
            }
            cout << endl;
        }
        return 0;
    

    }

    I hope this helps you. You can read about Netpbm format on wikipedia.


    EDIT2: The image output is clear text.
    Result is like this:
    test image (Tiny, isn't it? edit line 16 to 512x512 or something)

    And the actual output is this:

    P3
    10 10
    255
    0 0 0 25 0 0 51 0 0 76 0 0 102 0 0 127 0 0 153 0 0 178 0 0 204 0 0 229 0 0 
    0 0 25 25 0 25 51 0 25 76 0 25 102 0 25 127 0 25 153 0 25 178 0 25 204 0 25 229 0 25 
    0 0 51 25 0 51 51 0 51 76 0 51 102 0 51 127 0 51 153 0 51 178 0 51 204 0 51 229 0 51 
    0 0 76 25 0 76 51 0 76 76 0 76 102 0 76 127 0 76 153 0 76 178 0 76 204 0 76 229 0 76 
    0 0 102 25 0 102 51 0 102 76 0 102 102 0 102 127 0 102 153 0 102 178 0 102 204 0 102 229 0 102 
    0 0 127 25 0 127 51 0 127 76 0 127 102 0 127 127 0 127 153 0 127 178 0 127 204 0 127 229 0 127 
    0 0 153 25 0 153 51 0 153 76 0 153 102 0 153 127 0 153 153 0 153 178 0 153 204 0 153 229 0 153 
    0 0 178 25 0 178 51 0 178 76 0 178 102 0 178 127 0 178 153 0 178 178 0 178 204 0 178 229 0 178 
    0 0 204 25 0 204 51 0 204 76 0 204 102 0 204 127 0 204 153 0 204 178 0 204 204 0 204 229 0 204 
    0 0 229 25 0 229 51 0 229 76 0 229 102 0 229 127 0 229 153 0 229 178 0 229 204 0 229 229 0 229 
    
    0 讨论(0)
  • 2021-02-10 21:57

    Not sure, what is your exact requirement [ since you didnot paste a snippet of the code .. as Greg requested ], following example might resolve it :

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    int main()
    {
        float i=1;
        unsigned char c;
        c = static_cast<unsigned char>(i);
        cout << c << endl;
        getch();
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题