4

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 char and a char. I need an unsigned char because I am going to print to an image file (0-255 RGB).

unsigned char*** pixels = new unsigned char**[SIZE];
vector<float> pixelColors;

...

sprintf(pixels[i][j][k], "%.4g", pixelColors.at(k));

(pixelColors has size of 3 and 'k' refers to a 'for loop' variable)

mskfisher
  • 3,291
  • 4
  • 35
  • 48
Steve
  • 115
  • 1
  • 3
  • 6
  • DO you want to convert a float into a string? Or do you want to print the binary representation of a floating value? – Martin York Oct 10 '10 at 03:19
  • I edited my main post. I have a 3D dynamic array of unsigned char's and want to store the byte value for each float. – Steve Oct 10 '10 at 03:33
  • Wait, do you mean that you are going to send the image data to the printer? If so then you'll have to look up CUPS (Common Unix Printing System) or the windows equivalent. – Frank Oct 10 '10 at 03:43
  • As others have said - what is the range for the floats? Is it 0.0 to 1.0, or something else? You are going to need to scale the float range to the unsigned char range. – Jeff Oct 10 '10 at 03:46
  • @Frank No, just an image file. @Jeff From 0-255 – Steve Oct 10 '10 at 03:54
  • Okay, then it is a lot easier ^-^ – Frank Oct 10 '10 at 03:57

2 Answers2

8

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 
Makogan
  • 8,208
  • 7
  • 44
  • 112
Frank
  • 2,640
  • 2
  • 21
  • 21
2

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;
}
Roopesh Majeti
  • 556
  • 1
  • 11
  • 23