#2
by みけCAT » 3年前
コードを見ると、画像ファイル中にヘッダやパディングなどは無く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;
}
コードを見ると、画像ファイル中にヘッダやパディングなどは無く1ピクセルを1バイトで表現するようなので、
出力サイズを表す変数を追加し、それに従って出力データを確保、設定、書き出しするといいでしょう。
また、提示されたコードはC言語ではなくC++ですね。
C言語にするには、newのかわりにmalloc、delete[]のかわりにfreeを使うといいでしょう。
[url=https://linuxjm.osdn.jp/html/LDP_man-pages/man3/malloc.3.html]Man page of MALLOC[/url] (freeの説明も載っています)
[code]
#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;
}
[/code]