c言語画像処理 出力する画像のサイズを変更する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ラルフローレン

c言語画像処理 出力する画像のサイズを変更する

#1

投稿記事 by ラルフローレン » 2年前

c言語画像処理プログラムについて質問です。
課題内容は8bit_256_256.imgのテスト画像から任意のコントラストと回転中心の画像をサイズを512*512に変更して出力するプログラムです。
8bit_256_256.imgのテスト画像を複製して256*256で出力することはできたのですが、同じようにして512*512で出力するやりかたがわからないです。

コード:

 
 
 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main()
{
	unsigned char* InImage; //入力画像データの配列の宣言
	unsigned char* OutImage; //出力画像データの配列宣言
	char InFile[100], OutFile[100]; //入出力画像ファイル名の宣言
	int i, Xsize, Ysize;
	FILE* fp;                       // fopen関数で必要な入力バッファの宣言
	printf("\n入力する画像のファイル名を入力してください)\t");
	gets_s(InFile, sizeof(InFile));
	printf("\n出力する画像のファイル名を入力してください)\t");
	gets_s(OutFile, sizeof(OutFile));
	Xsize = 256; Ysize = 256;
	InImage = new unsigned char[Xsize * Ysize];
	OutImage = new unsigned char[Xsize * Ysize];
	//配列InImage,OutImageのメモリ領域を動的に保存

	if ((fp = fopen(InFile, "rb")) == NULL) {
		printf("Could not open filename %s \n", InFile);
		exit(0);
	}
	fread(InImage, sizeof(unsigned char), Xsize * Ysize, fp);
	fclose(fp);

	for (i = 0; i < Xsize * Ysize; i++) {
		OutImage[i] = InImage[i]; //InImageの中身OutImageに複製
	}
	if ((fp = fopen(OutFile, "wb")) == NULL) {
		printf("Could not open filename %s \n", OutFile);
		exit(0);
	}
	fwrite(OutImage, sizeof(unsigned char), Xsize * Ysize, fp);
	fclose(fp);
	printf("(123,123) = %d\n", OutImage[123 * Xsize + 123]);
	printf("(87,144) = %d\n", OutImage[144 * Xsize + 87]);
	delete[]InImage;
	delete[]OutImage;
	return 0;
}
 
 
 
 
 
  

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: c言語画像処理 出力する画像のサイズを変更する

#2

投稿記事 by みけCAT » 2年前

コードを見ると、画像ファイル中にヘッダやパディングなどは無く1ピクセルを1バイトで表現するようなので、
出力サイズを表す変数を追加し、それに従って出力データを確保、設定、書き出しするといいでしょう。

また、提示されたコードはC言語ではなくC++ですね。
C言語にするには、newのかわりにmalloc、delete[]のかわりにfreeを使うといいでしょう。
Man page of MALLOC (freeの説明も載っています)

コード:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main()
{
	unsigned char* InImage; //入力画像データの配列の宣言
	unsigned char* OutImage; //出力画像データの配列宣言
	char InFile[100], OutFile[100]; //入出力画像ファイル名の宣言
	int i, XsizeIn, YsizeIn, XsizeOut, YsizeOut; // 入力と出力のサイズを別に用意
	FILE* fp;                       // fopen関数で必要な入力バッファの宣言
	printf("\n入力する画像のファイル名を入力してください)\t");
	gets_s(InFile, sizeof(InFile));
	printf("\n出力する画像のファイル名を入力してください)\t");
	gets_s(OutFile, sizeof(OutFile));
	XsizeIn = 256; YsizeIn = 256;
	XsizeOut = 512; YsizeOut = 512;
	// mallocの結果のキャストはC言語では不要だが、C++では必要
	InImage = (unsigned char*)malloc(sizeof(*InImage) * XsizeIn * YsizeIn);
	OutImage = (unsigned char*)malloc(sizeof(*OutImage) * XsizeOut * YsizeOut);
	//配列InImage,OutImageのメモリ領域を動的に保存

	if ((fp = fopen(InFile, "rb")) == NULL) {
		printf("Could not open filename %s \n", InFile);
		exit(0);
	}
	fread(InImage, sizeof(unsigned char), XsizeIn * YsizeIn, fp);
	fclose(fp);

	//InImageの中身OutImageに複製
	for (i = 0; i < YsizeOut; i++) {
		int j;
		for (j = 0; j < XsizeOut; j++) {
			OutImage[i * XsizeOut + j] = InImage[(i % YsizeIn) * XsizeIn + (j % XsizeIn)];
		}
	}
	if ((fp = fopen(OutFile, "wb")) == NULL) {
		printf("Could not open filename %s \n", OutFile);
		exit(0);
	}
	fwrite(OutImage, sizeof(unsigned char), XsizeOut * YsizeOut, fp);
	fclose(fp);
	printf("(123,123) = %d\n", OutImage[123 * XsizeOut + 123]);
	printf("(87,144) = %d\n", OutImage[144 * XsizeOut + 87]);
	free(InImage);
	free(OutImage);
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語画像処理 出力する画像のサイズを変更する

#3

投稿記事 by usao » 2年前

「何がわからないという話なのか」が不明だが……
「自分が何をすれば良いのか」というのが明確になるように物事を進めてみてはどうか.

例えば……

---

やるべきことは
【出力画像の全ての画素についての画素値を決定すること】
であろう.

であれば,とりあえず【出力画像の位置(x,y)の画素値を決定して返す関数】を用意することを考えてはどうか.
mainの処理は 512*512 回繰り返すループ内でその関数を呼んでは戻り値を得るだけの処理となるだろう.
(あとはその結果をファイルに書き出す処理があるだけ.)
そしたらあとは「この関数の中身をどうするか(何をreturnするか)」ということを決めれば良いだけの問題になる.

まずはダミー実装として中身が
return 0;
というだけの関数にしてみれば,真っ黒な512*512サイズの画像が出力されることになるだろう.
一度その動作が確認できた(=main側が完成したことが確認できた)なら,あとは関数の中身を書き換えれば完了だ.
(いくらでも好きな方法を試してみればいい)

---

アバター
usao
記事: 1887
登録日時: 11年前

Re: c言語画像処理 出力する画像のサイズを変更する

#4

投稿記事 by usao » 2年前

どうでもいい話だけども,
出力画像の画素値はファイルに出力するだけ(他には使わない)という話なら,
出力画像全体なサイズのでかい配列は必須ではないよね.

「1pixelずつファイルに出力するループ」を書くなら配列は不要だし
「1行ずつファイル出力するループ」なら1行分のサイズの配列で事足りる.

個人的には,「1pixelずつファイルに出力するループ」の形が
最もプログラムとしては簡単かな? とか思う.
(出力画像データのためのメモリ確保と解放の処理が不要という点で)

返信

“C言語何でも質問掲示板” へ戻る