2013-06-11 121 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