用C / C ++读取图像文件

时间:2010-01-16 06:54:14

标签: c++ c jpeg

我需要用C / C ++读取图像文件。如果有人可以为我发布代码,那将是非常好的。

我处理灰度图像,图像是JPEG。我想把图像读成2D数组,这将使我的工作变得简单。

7 个答案:

答案 0 :(得分:14)

您可以通过查看JPEG format来编写自己的内容。

也就是说,尝试预先存在的库,例如CImgBoost's GIL。或者严格地说是JPEG,libjpeg。 CodeProject上还有CxImage类。

这是big list

答案 1 :(得分:8)

如果你决定采用最小方法,没有libpng / libjpeg依赖,我建议使用stb_imagestb_image_write,找到here

这很简单,您只需将标题文件stb_image.hstb_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)

检查此帖子:read and write image file

另外,请查看this other question at Stackoverflow

答案 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)

试用CImg库。 tutorial将帮助您熟悉。拥有CImg对象后,data()函数将允许您访问2D像素缓冲区数组。

答案 6 :(得分:1)