2010-10-10 3 views
4

Я новичок в C++ и занимаюсь небольшим поиском в Интернете. Я думал, что sprintf выполнит эту работу, но я получаю сообщение об ошибке при компиляции, что я не могу конвертировать между и char. Мне нужен символ unsigned, потому что я собираюсь распечатать файл изображения (0-255 RGB).C++ Преобразование float в unsigned char?

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

... 

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

(pixelColors имеет размер 3 и «к» относится к «для цикла» переменной)

+0

DO вы хотите конвертировать поплавок в строку? Или вы хотите напечатать двоичное представление плавающего значения? –

+0

Я отредактировал свой главный пост. У меня есть трехмерный динамический массив unsigned char и вы хотите сохранить значение байта для каждого поплавка. – Steve

+0

Подождите, вы имеете в виду, что собираетесь отправлять данные изображения на принтер? Если это так, вам придется искать CUPS (Common Unix Printing System) или эквивалент Windows. – Frank

ответ

7

Я предполагаю, что поплавки находятся в диапазоне 0,0 ... 1,0, то делает так:

float redf = 0.5f; 
unsigned char reduc = redf * 255; 
44445164 +10617451515053691368888

Переменная REDUC теперь 128.


EDIT: полный пример, вывод изображения в формате PPM Net.

// 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; 

}

Я надеюсь, что это поможет вам. Вы можете прочитать о Netpbm format on wikipedia.


EDIT2: Вывод изображения чистый текст.
Результат выглядит так:
test image (Крошка, не правда ли редактировать строки 16 до 512x512 или что-то?)

И фактический выход таков:

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 
2

Не уверен, что ваше точное требование [так как вы didnot вставить фрагмент кода .. в соответствии с просьбой Greg], следующий пример может разрешить его:

#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

Попробую, спасибо! – Steve

Смежные вопросы