2012-04-11 177 views
-1

我试图将(双)的矩阵转换成一个无符号的字符,然后我可以写入一个.pmg文件...但它不工作。将double转换为unsigned char?

void writePNG(vector<double>& matrix) 
{ 
vector<unsigned char> image; 
ofstream myfile; 

myfile.open("newFile.txt", ios::out); // writing to .txt file for now for testing. 

if(!myfile.is_open()) 
{ 
    cout << "Cannot open file"; 
} 
for(int i=0; (i < 512*512); i++) 
{ 
    image[i] = (unsigned char) matrix[i]; 
} 

myfile.close(); 
} 

它不会转换数据。有任何想法吗??谢谢:)

+0

到底是什么错误?是否有编译器错误?该文件是否为空(这肯定是这种情况,因为您不写任何内容)?有没有运行时错误? – alfa 2012-04-11 14:45:48

+0

将声明更改为'vector 图像(512 * 512);'。 – 2012-04-11 14:46:16

+0

那么你看到的错误是什么?矩阵向量中值的范围是什么?例如。如果-1 ... 1,那么你需要首先缩放值。 – 2012-04-11 14:47:48

回答

2
  • 错误:您正在创建大小为0的向量,然后写入其不存在的元素。
  • 错误:你永远不将数据写入到文件
  • 风格:您不必要关闭文件。当fstream对象超出范围时,它将被关闭
  • 样式:您在循环中复制数据。使用vector::vector可更清楚地显示您的意图。
  • 潜在的bug:无论输入矢量的大小如何,您都可以创建一个512x512的输出矢量。
  • SSCCE您的测试用例不完整。

试试这个:

#include <vector> 
#include <iostream> 
#include <fstream> 

void writePNG(const std::vector<double>& matrix) 
{ 
    std::ofstream myfile("newFile.txt", std::ios::out); 

    if(!myfile.is_open()) 
    { 
    std::cout << "Cannot open file"; 
    } 
    std::vector<unsigned char> image (matrix.begin(), matrix.end()); 
    myfile.write(reinterpret_cast<const char*>(&image[0]), image.size()); 
} 

int main() { 
    writePNG({ 
    72, 101, 108.1, 108.2, 
    111, 0x2c, 0x20, 0x77, 
    0x6f, 0x72, 0x6c, 
    100.3, 10.4}); 
} 
+0

难道你不能使用static_cast ()而不是'reinterpret_cast <>'? – Attila 2012-04-11 17:16:13

+0

不,我需要'reinterpret_cast'作为不相关的指针类型。 – 2012-04-11 17:21:39

0

你的图像矢量具有零大小 - 你将不得不至少做一个push_back来添加一个元素。此外,double的大小与char的大小不同,因此您将失去信息。

1

您正在使用vector的默认构造函数创建image,该构造函数将向量初始化为空(不包含元素)。下标符号(image[i])不会创建元素,只会分配给已经存在的元素。

你有(至少)两种方式来解决这个问题:

  • 声明image使用vector,其分配所需的大小的构造函数:vector<unsigned char> image(512*512) - 这将填充默认的512个* 512元素的矢量值(0用于unsigned char
  • 添加元素一个接一个使用push_back方法:image.push_back((unsigned char) matrix[i]);

你也必须令e最终的imagemyfile的内容。

注意:使用static_cast<unsigned char>(...)代替C型(unsigned char) ...是个好习惯,因为前者可以发现后者不会标记的错误;这是不是在这种特殊情况下的问题,虽然

相关问题