在C/C++中阅读图像文件[关闭]

6yt4nkrj  于 2023-06-21  发布在  C/C++
关注(0)|答案(7)|浏览(156)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

5年前关闭。
Improve this question
我需要在C/C++中读取一个图像文件。这将是非常伟大的,如果有人能为我张贴的代码。
我工作的灰度图像和图像是JPEG。我想读到一个二维数组的图像,这将使我的工作很容易。

vzgqcmou

vzgqcmou1#

如果您决定采用最小的方法,不依赖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

其他轻量级替代方案包括:

kuhbmx9i

kuhbmx9i2#

您可以通过查看JPEG format来编写自己的代码。
也就是说,尝试一个预先存在的库,如CImgBoost's GIL。或者对于严格的JPEG,libjpeg。CodeProject上还有CxImage类。
这是一个big list

0aydgbwb

0aydgbwb3#

查看英特尔Open CV库...

46scxncf

46scxncf5#

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++;
}

pixels是一维数组,但您可以轻松地将给定的x和y位置转换为1D数组中的位置。类似pos =(y * width)+ x

rdrgkggo

rdrgkggo6#

尝试CImg库。tutorial将帮助您熟悉。有了CImg对象后,data()函数将给予您访问2D像素缓冲区数组。

相关问题