我正在尝试将(双精度)矩阵转换为无符号字符,以便我可以写入.pmg文件......但它无效。
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 :(得分:2)
fstream
对象超出范围vector::vector
可以更清楚地显示您的意图。试试这个:
#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});
}
答案 1 :(得分:1)
您正在使用image
的默认构造函数创建vector
,它将向量初始化为空(不包含任何元素)。下标符号(image[i]
)不会创建元素,只会分配给已经存在的元素。
你有(至少)两种方法来修复它:
image
的ctor声明vector
:vector<unsigned char> image(512*512)
- 这将使用默认值为512 * 512的元素填充向量({{1 }})unsigned char
方法逐个添加元素:push_back
您还必须最终将image.push_back((unsigned char) matrix[i]);
的内容写入image
。
注意:使用myfile
而不是C风格的static_cast<unsigned char>(...)
是一个好习惯,因为前者可以找到后者不会标记的错误;在这种特殊情况下,这不是问题,但
答案 2 :(得分:0)
您的图像矢量大小为零 - 您必须至少执行push_back才能添加元素。此外,double的大小与char的大小不同,因此您将丢失信息。