-1

我正在尝试将(双精度)矩阵转换为无符号字符,这样我就可以写入 .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();
}

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

4

3 回答 3

2
  • 错误:您正在创建一个大小为 0 的向量,然后写入其不存在的元素。
  • 错误:您永远不会将数据写入文件
  • style:您不必要地关闭文件。fstream当对象超出范围时它将关闭
  • style:您在循环中复制数据。使用vector::vector更清楚地显示您的意图。
  • 潜在的错误:无论输入向量的大小如何,您都会创建一个 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});
}
于 2012-04-11T15:08:58.713 回答
1

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

你有(至少)两种方法来修复它:

  • 使用分配必要大小image的 ctor声明:- 这将使用 512*512 个默认值元素(0 表示)填充向量vectorvector<unsigned char> image(512*512)unsigned char
  • push_back使用以下方法一一添加元素:image.push_back((unsigned char) matrix[i]);

您还必须最终编写 to 的image内容myfile

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

于 2012-04-11T14:51:48.507 回答
0

您的图像矢量大小为零 - 您至少必须执行 push_back 才能添加元素。此外,double 的大小与 char 的大小不同,因此您将丢失信息。

于 2012-04-11T14:48:07.657 回答