我有以下代码:
#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(每行一个像素) )在文件中?
我想我需要对它们进行相同的char渲染,但我不知道如何将它们连接在一起。每个file.write()都会自动在末尾添加一个LF。
感谢。
答案 0 :(得分:1)
二进制文件没有“换行符”或行的概念。它们仅用于文本文件,使我们凡人都可以阅读。所以从这个意义上说,你不必担心换行。继续将二进制颜色值写入文件。您应该关注的唯一事情是谁正在使用此文件,以及您用于写入文件的二进制格式是否为该使用者所接受。
答案 1 :(得分:1)
我将假设rgb.red()
等都返回int
。如果是这样,那么您可以用与编写列数和行数完全相同的方式编写这些值:
int red = (int)(rgb.red() * 256);
myFile.write(reinterpret_cast <const char*> (&red), sizeof(red));
请注意,二进制文件没有LF或CR的任何概念。它们只包含您通过read()
和write()
来电解释的二进制数据。