Чтение файла изображения в C/С++

Мне нужно прочитать файл изображения в C/С++. Было бы очень здорово, если бы кто-то мог опубликовать код для меня.

Я работаю над изображениями с серой шкалой, а изображения - в формате JPEG. Я хотел бы прочитать изображения в 2D-массив, который упростит мою работу.

Заранее спасибо

Ответы

Ответ 2

Если вы решите пойти на минимальный подход, без зависимостей libpng/libjpeg, я предлагаю использовать stb_image и stb_image_write, найти здесь.

Это так просто, как вам нужно, вам просто нужно поместить файлы заголовков 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

Другие легкие альтернативы включают:

  • lodepng для чтения и записи файлов png
  • jpeg-compressor для чтения и записи файлов jpeg

Ответ 3

Ознакомьтесь с библиотекой Intel Open CV...

Ответ 4

Попробуйте библиотеку CImg. tutorial поможет вам ознакомиться. Когда у вас есть объект CImg, функция data() даст вам доступ к массиву буфера 2D-пикселей.

Ответ 5

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