
ゆうき( @BASEBALLY15 )です^^
今日は,どうしたんじゃ?
現在,C言語で画像処理の勉強をしています.
入力画像をそのまま出力したいのですが,コードの書き方が分かりません・・・
了解じゃ!
早速,コードを紹介していくぞ!
(※Visual Studio 2017を使用)
お願いします!

目次
入力画像をそのまま出力するって,どういうこと?

画像を入力するためのコードが完成したけれど,本当に入力できているのか不安に感じたことはないですか?
特に初心者の方は,コード1つ1つの使い方を理解できていない場合が多いので,こういった不安を抱くことがあるのではないでしょうか?
そういった時に,入力画像をそのまま保存することで,ちゃんと入力できているかを確認することが出来ます.
初心者の方以外は,あまり使う機会が無いと思いますが,いざという時に使うことが出来るので,ぜひ参考にしてみて下さい^^
画像をRAW形式に変換しよう!(準備①)
画像の形式と言えば,『.jpeg』や『.png』を思い浮かべるのではないでしょうか?
実はこの形式のままでは,画像処理を行うことが出来ません.
画像処理を行うためには,画像をRAW形式に変換しておく必要があります.
以下のサイトで,RAW形式に変換する方法をご紹介しているので,先にそちらを見て頂いた方がいいかもしれません^^
(※OpenCVを使う場合は,.jpegや.pngでも扱えます.)
標準入力関数を使えるようにしよう!(準備②)
『Visual Studio 2012以降』を使っている方は,標準入力を行うための関数を使うために,少し処理を行わなければいけません.
今から,その方法をご紹介します.
Visual Studioのヘッダーファイルを開いてください.

そして,『pch.h』をダブルクリックして,以下のコードを記述してください.
#define _CRT_SECURE_NO_WARNINGS
これで,標準入力を行うための関数(scanfやfopenなど)を使うことが出来ます^^
それでは,本題の『カラー画像の読み込みと保存の方法』についてご紹介します⤵
画像処理を行ってみよう!(本題)
カラー画像を読み込む前に・・・
まずは,ヘッダーファイルを記述し,読み込み用のファイルと保存用のファイルパスを用意します.
そして,画像のRGB値の配列と今回作成した関数のプロトタイプ宣言を行います.
#include "pch.h"
#include "stdio.h"
//exitを使う際に必要
#include "stdlib.h"
//画像サイズを定義する
#define X_SIZE 640
#define Y_SIZE 480
//読み込みと保存用のファイルパスを用意
char read_path[500];
char save_path[500];
//入力のRGB値を用意
unsigned char r_in[Y_SIZE][X_SIZE], g_in[Y_SIZE][X_SIZE], b_in[Y_SIZE][X_SIZE];
//関数のプロトタイプを宣言する
void read_img(char *read_path, unsigned char r_in[Y_SIZE][X_SIZE], unsigned char g_in[Y_SIZE][X_SIZE], unsigned char b_in[Y_SIZE][X_SIZE]);
void save_img(char *save_path, unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE]);
メインとなる関数を作成しておこう!
カラー画像の読み込みと保存を行う前に,メインとなる関数を作っておきます.
実行した時に,メイン関数内に書かれているコードが動作します.
void main(void)
{
//入力画像の読み込み
read_img(read_path, r_in, g_in, b_in);
//出力画像の保存
save_img(save_path, r_in, g_in, b_in);
}
カラー画像を読み込もう!
次に,カラー画像を読み込むための関数を作成します.
//入力画像の読み込み
void read_img(char *read_path, unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE])
{
int i, j;
//ファイルためのファイルを用意
printf("読み込むファイル-->");
//標準入力をバッファに格納する
scanf("%s", read_path);
FILE *fp;
//ファイルを開く
fp = fopen(read_path, "rb");
//もし,ファイルが無いときに終了させる
if (fp == NULL)
{
printf("ファイルが存在しません", read_path);
exit(-1);
}
//画像内からRGB値の取得(ラスタ走査)
for (j = 0; j < Y_SIZE; j++)
{
for (i = 0; i < X_SIZE; i++)
{
r[j][i] = fgetc(fp);
g[j][i] = fgetc(fp);
b[j][i] = fgetc(fp);
}
}
//ファイルを閉じる
fclose(fp);
}
カラー画像を保存しよう!
最後に,カラー画像を保存するための関数を作成します.
//出力画像の保存
void save_img(char *save_path, unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE])
{
int i, j;
FILE *fp;
printf("どのファイルに保存しますか?-->");
scanf("%s", save_path);
//ファイルを開く
fp = fopen(save_path, "wb");
////もし,ファイルが無いときに終了させる
if (fp == NULL)
{
printf("ファイルが存在しません", save_path);
exit(-1);
}
//画像のRGB値をファイルに保存する
for (j = 0; j < Y_SIZE; j++)
{
for (i = 0; i < X_SIZE; i++)
{
fputc(r[j][i], fp);
fputc(g[j][i], fp);
fputc(b[j][i], fp);
}
}
//ファイルを閉じる
fclose(fp);
}
実行しよう!
メインとなる関数を実行すると,以下の画面が表示されます.
読み込むファイルと保存するファイルを書き込むと,完了です!!^^

終わりに
今回は,C言語を使って,カラー画像を読み込む方法と保存する方法についてご紹介しました.
この方法を応用させると,モノクロ画像や二値化画像を保存したり出来ます.
ぜひ,挑戦してみて下さい^^
今後,機会があれば,その方法についても投稿しようと思います!
それでは・・・