2013-06-11 83 views
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; 
} 

这个伟大的工程,因为它吐出来给我看看(并确保它在做正确的事情。)注的值:yes ,我知道它从右下角开始读到0,0。这是这里的意图。

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

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

谢谢。

+0

退房http://en.cppreference.com/w/cpp/io/basic_ostream/write –

+0

感谢您的建议。我想我不了解的是如何将它们作为一个字符串(用逗号分隔)并将其写出来。我可以将单个值写出来(在转换为char *之后),但我不确定如何在文件中将所有三个值作为一行。 – KirAsh4

+0

你在写文本文件还是二进制文件?如果它是二进制的,那么为什么你需要用逗号分隔值呢? –

回答

1

我打算假设rgb.red()等全部返回int

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

需要注意的是二进制文件不具有LF或CR的任何概念:如果是这样,那么您可以在正是你写的行和列数以相同的方式写这些值。它们只包含您通过read()write()调用解释的二进制数据。

+0

实际上,$ rgb.color()返回一个浮点数(在0和1之间),这就是为什么它乘以255得到一个介于0和255之间的值。但是,在前面的评论中提到了其他一些内容,逗号。我没有答案。我习惯于看到由逗号分隔的(ascii)数据,所以这是我做的一个假设,我需要在这里做同样的事情。我想我会按原样写下来并从那里出发。感谢指针。 – KirAsh4

+0

@ KirAsh4您需要决定是否要将数据输出为ASCII文本(在这种情况下,用逗号分隔数字当然有意义),或者以二进制形式(在这种情况下,逗号是不必要的)。您还需要决定是否要将颜色值输出为0.0到1.0之间的浮点数,或者将其作为0到255之间的整数。无论采用哪种方式,上面给出的代码都适用于写入二进制数据。只需将'int red'改为'float red',并可选地乘以256。 –

+0

我正在写二进制文件,所以nix是整个逗号事物。我需要写入0到255之间的整数,因此我在上面的代码中进行乘法运算。 255是正确的值,而不是256. – KirAsh4

1

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

+0

“消费者”就是我。这是将图像文件转换为每个像素的相应rgb值。然后该数据文件将传输到SD卡上,然后Arduino将访问该SD卡并将数据拉出并推送到一串LED。这只是一个更大的一块。 – KirAsh4