我需要用C / C ++读取图像文件。如果有人可以为我发布代码,那将是非常好的。
我处理灰度图像,图像是JPEG。我想把图像读成2D数组,这将使我的工作变得简单。
答案 0 :(得分:14)
您可以通过查看JPEG format来编写自己的内容。
也就是说,尝试预先存在的库,例如CImg或Boost's GIL。或者严格地说是JPEG,libjpeg。 CodeProject上还有CxImage类。
这是big list。
答案 1 :(得分:8)
如果你决定采用最小方法,没有libpng / libjpeg依赖,我建议使用stb_image
和stb_image_write
,找到here。
这很简单,您只需将标题文件stb_image.h
和stb_image_write.h
放在您的文件夹中即可。
以下是阅读图片所需的代码:
#include <stdint.h>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
int main() {
int width, height, bpp;
uint8_t* rgb_image = stbi_load("image.png", &width, &height, &bpp, 3);
stbi_image_free(rgb_image);
return 0;
}
以下是编写图像的代码:
#include <stdint.h>
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
#define CHANNEL_NUM 3
int main() {
int width = 800;
int height = 800;
uint8_t* rgb_image;
rgb_image = malloc(width*height*CHANNEL_NUM);
// Write your code to populate rgb_image here
stbi_write_png("image.png", width, height, CHANNEL_NUM, rgb_image, width*CHANNEL_NUM);
return 0;
}
您可以在没有标志或依赖项的情况下进行编译:
g++ main.cpp
其他轻量级替代产品包括:
答案 2 :(得分:3)
查看英特尔Open CV库 ...
答案 3 :(得分:3)
答案 4 :(得分:2)
corona很好。从教程:
corona::Image* image = corona::OpenImage("img.jpg", corona::PF_R8G8B8A8);
if (!image) {
// error!
}
int width = image->getWidth();
int height = image->getHeight();
void* pixels = image->getPixels();
// we're guaranteed that the first eight bits of every pixel is red,
// the next eight bits is green, and so on...
typedef unsigned char byte;
byte* p = (byte*)pixels;
for (int i = 0; i < width * height; ++i) {
byte red = *p++;
byte green = *p++;
byte blue = *p++;
byte alpha = *p++;
}
像素将是一维数组,但您可以轻松地将给定的x和y位置转换为1D数组中的位置。像pos =(y * width)+ x
之类的东西答案 5 :(得分:1)
答案 6 :(得分:1)