0

我有以下代码:

#include <Magick++.h>
#include <iostream>
#include <fstream>

using namespace Magick;
using namespace std;

unsigned short int version = 1;
unsigned short int cols, rows;
short int myCol, myRow;

int main(int argc, char **argv) {
  ofstream myFile;
  myFile.open("img001.bin", ios::out | ios::trunc | ios::binary);
  myFile.write(reinterpret_cast<const char*> (&version), sizeof(version));

  try {
    InitializeMagick(*argv);
    Image img("noname-th.jpg");
    cols = img.columns();
    rows = img.rows();
    myFile.write(reinterpret_cast <const char*> (&cols), sizeof(cols));
    myFile.write(reinterpret_cast <const char*> (&rows), sizeof(rows));

    for (myCol = cols - 1; myCol >= 0; myCol--) {
      for (myRow = rows - 1; myRow >= 0; myRow--) {
        ColorRGB rgb(img.pixelColor(myCol, myRow));
        cout << "red: "     << (rgb.red()   * 255);
        cout << ", green: " << (rgb.green() * 255);
        cout << ", blue: "  << (rgb.blue()  * 255) << endl;
      }
    }
  }
    catch ( Magick::Exception & error) {
    cerr << "Caught Magick++ exception: " << error.what() << endl;
  }
  return 0;
}

这很有效,因为它会吐出让我看到的值(并确保它在做正确的事情。)注意:是的,我知道它从右下角开始向下读取到 0,0。这就是这里的意图。

我现在需要的是弄清楚如何将这些 rgb 值写入打开的文件。对于每个像素,我从 rgb.red() * 255、rgb.green() * 255 和 rgb.blue() * 255 中获取值。如何将这些值存储为 r、g、b(每行一个像素) 在文件中?

我想我需要对它们进行相同的字符转换,但我不知道如何将它们连接在一起。每个 file.write() 都会在末尾自动添加一个 LF。

谢谢。

4

2 回答 2

1

二进制文件没有“换行符”或行的概念。它们仅用于文本文件,以使其对我们凡人具有可读性。所以从这个意义上说,你不需要担心换行符。继续将二进制颜色值写入文件。您唯一应该关心的是谁在使用此文件,以及您用于写入文件的二进制格式是否对该使用者可接受。

于 2013-06-11T22:22:42.087 回答
1

我将假设rgb.red(),等等都返回int。如果是这样,那么您可以以与编写列数和行数完全相同的方式编写这些值:

int red = (int)(rgb.red() * 256);
myFile.write(reinterpret_cast <const char*> (&red), sizeof(red));

请注意,二进制文件没有任何 LF 或 CR 的概念。它们仅包含您解释read()write()调用的二进制数据。

于 2013-06-11T22:23:05.317 回答