2014-03-31 41 views
0

我有它原始的RGB值的數組,我需要將這些值寫入JPEG文件。是否有捷徑可尋?原始RGB值,以JPEG

enter image description here

我想:

std::ofstream ofs("./image.JPG", std::ios::out | std::ios::binary); 

for (unsigned i = 0; i < width * height; ++i) { 
    ofs << (int)(std::min(1.0f, image[i].x) * 255) << (int)(std::min(1.0f, image[i].y) * 255) << (int)(std::min(1.0f, image[i].z) * 255); 
} 

但格式不被認可。

+0

你看過JPEG規範嗎?或者,如果你不想手動編碼數據(我建議你不要),libjpeg是一個流行的選擇。 – Cameron

+1

Err ...除了整個「JPEG格式」的東西,你想要製作一個像素高,X像素寬的單個JPEG?如果沒有,JPEG應該如何知道如何將你的像素線包裹到圖像中? – meagar

+0

@meagar不,這只是我要存儲的數據的格式。 –

回答

1

如果你想製作你可能看Netpbm的圖像文件。你可以簡單地從你所擁有的東西中寫出中間格式(PBM或PAM)。然後有大量已經寫好的程序可以從中間文件生成許多類型的圖像。

0

WOH THERE!

JPEG比原始RGB值的要複雜得多。您將需要使用庫,如LIBJPEG,將數據存儲爲JPEG。

如果你自己寫的你必須:從RGB

  1. 轉換爲YCbCr
  2. 樣品圖像
  3. 劃分爲8×8塊。
  4. 對每個塊執行DCT。
  5. 運行長度/霍夫曼編碼的值
  6. 寫格式正確的JPEG區塊這些值。
0

你可以使用Boost GIL:它是免費的,可移植的(這是Boost庫的一部分),跨操作系統(包括Windows)的廣譜使用。

流行的Linux和Unix發行比如Fedora,Debian和NetBSD的包括預建升壓包。

的代碼非常簡單:

#include <boost/gil/extension/io/jpeg_io.hpp> 

const unsigned width = 320; 
const unsigned height = 200; 

// Raw data. 
unsigned char r[width * height]; // red 
unsigned char g[width * height]; // green 
unsigned char b[width * height]; // blue 

int main() 
{ 
    boost::gil::rgb8c_planar_view_t view = 
    boost::gil::planar_rgb_view(width, height, r, g, b, width); 

    boost::gil::jpeg_write_view("out.jpg", view); 

    return 0; 
} 

jpeg_write_view保存當前實例化視圖由name指定的JPEG文件(拋出std::ios_base::failure如果無法創建文件)。

記住你的程序與-ljpeg鏈接。