web-dev-qa-db-ja.com

C / C ++での画像ファイルの読み取り

C/C++で画像ファイルを読み取る必要があります。誰かが私のためにコードを投稿できるなら、それは非常に素晴らしいでしょう。

私はグレースケール画像で作業しており、画像はJPEGです。画像を2D配列に読み込んで、作業を簡単にします。

21
skyrulz

JPEG形式 を見て独自のコードを作成できます。

つまり、 CImg または Boost's GIL のような既存のライブラリを試してください。または、厳密にJPEGの場合、 libjpeg 。 CodeProjectには CxImage クラスもあります。

大きなリスト です。

14
GManNickG

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

その他の軽量の代替手段は次のとおりです。

10

チェックアウトIntel Open CV library ...

3
Ashish

このスレッドを確認してください: イメージファイルの読み取りと書き込み

また、 Stackoverflowでのこの他の質問 もご覧ください。

3
Lazer

コロナ はいいですね。チュートリアルから:

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

ピクセルは1次元配列ですが、指定されたxおよびy位置を1D配列の位置に簡単に変換できます。 pos =(y * width)+ xのようなもの

2
Firas Assaad

CImg ライブラリを試してください。 tutorial は慣れるのに役立ちます。 CImgオブジェクトを取得したら、 data() 関数を使用して2Dピクセルバッファー配列にアクセスできます。

1
mwcz

Magick ++ APIImageMagick にチェックアウトします。

1