2017-02-10 455 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。