2017-02-10 54 views
1

基本上,我試圖學習如何手動打開圖像而無需使用LIBRARIES並查看RGB內容。從C++中讀取PNG中的RGB值

我想這樣做,所以我可以計算出RGB的色調和飽和度以寫回二維數組圖像。

到目前爲止,我得到這個:

#include <iostream> 
#include <stdio.h>  /* printf */ 
#include <math.h>  /* acos */ 
#include <fstream>  /* for file I/O */ 

using namespace std; 

int main() { 
     FILE* fp = NULL; 
     fp = fopen("soccerball.png", "rb"); 
     cout << "done" << endl; 
     return 0; 
} 

我知道這是不是很多,因爲我已經習慣了Python的。但我真的不知道從哪裏開始。在互聯網上似乎沒有這樣的例子。

所以我看了一張圖片。現在,我想是這樣的:

IMG [高度] [寬度]

,所以我可以

IMG_R [H] [W],img_g [H] [W] ,img_b [h] [w]

所以我可以使用這些值來計算相同格式的Hue 2d數組。

img_hue [H] [W]

感謝

+1

你知道BMP比沒有庫的PNG更容易閱讀嗎? –

+0

@AndreasRejbrand我是第二。 BMP是開始處理原始圖像數據的好地方。然後GIF來感受LZW,然後是PNG。沒有一些認真的努力,JPEG不會發生,它是迄今爲止最受懲罰的。 – tadman

+0

我可以輕鬆地將BMP轉換回PNG嗎? – hiquetj

回答

0

不能輕易打開PNG文件時沒有庫。

這裏是打開一個PNG與庫中樣本......這已經是一個很大的代碼 http://zarb.org/~gc/html/libpng.html

的事情是,PNG是壓縮格式。發生很多「數學問題」將RGB值壓縮成特殊格式。

一個.BMP(例如Windows位圖)是一種非常簡單的方法,可以讓您手動開始解析,如果您正在進行此培訓,但您需要其他格式的庫。

你可以從零開始做所有事情......但是需要一段時間,而你所做的這個問題,你離它有點遠了。

+0

這很好,所有的,我發現這個例子。但對於C++初學者來說。這是一個令人興奮的小精靈 – hiquetj

+0

! :-)我建議你先學習閱讀和寫作「.BMP」。他們很容易手動。一旦你對此感到滿意......學習如何使用lib_png。 –

+0

我得到運行,當這個錯誤:對建築x86_64的未定義符號: 「_png_create_info_struct」,從引用: _main在rgb2hsv-0f0846.o 「_png_create_read_struct」,從引用:在rgb2hsv-0f0846.o 「_png_init_io _main 「,引用自: _main in rgb2hsv-0f0846.o – hiquetj

0

通過洛德Vandevenne

https://github.com/MalcolmMcLean/babyxrc/blob/master/src/lodepng.c

文件lodePNG是從底層向上寫入一個PNG解析器的一個示例。

給定文件格式,你可以編寫你自己的解析器,但它有點涉及。作爲第一步,看看您是否可以打開二進制文件並檢測它是否是PNG。