Ответ 1
Вы можете написать свой собственный, посмотрев формат JPEG.
Тем не менее, попробуйте уже существующую библиотеку, например CImg, или Повысить GIL. Или для строго JPEG, libjpeg. В CodeProject также есть класс CxImage.
Здесь большой список.
Мне нужно прочитать файл изображения в C/С++. Было бы очень здорово, если бы кто-то мог опубликовать код для меня.
Я работаю над изображениями с серой шкалой, а изображения - в формате JPEG. Я хотел бы прочитать изображения в 2D-массив, который упростит мою работу.
Заранее спасибо
Вы можете написать свой собственный, посмотрев формат JPEG.
Тем не менее, попробуйте уже существующую библиотеку, например CImg, или Повысить GIL. Или для строго JPEG, libjpeg. В CodeProject также есть класс CxImage.
Здесь большой список.
Если вы решите пойти на минимальный подход, без зависимостей 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
Другие легкие альтернативы включают:
Ознакомьтесь с библиотекой Intel Open CV...
Попробуйте библиотеку CImg. tutorial поможет вам ознакомиться. Когда у вас есть объект CImg, функция data() даст вам доступ к массиву буфера 2D-пикселей.
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
Отметьте эту тему: читать и записывать файл изображения.
Кроме того, посмотрите fooobar.com/questions/362979/....
Просмотрите API Magick ++ в ImageMagick.