2019-04-19 15:11:55 C

C

Copy Copied! Full
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "../jpegio.h" /* 課題2-1 */ void addTwoImageRGB(char* frontName, char* backName, double frontRatio, double backRatio) { BYTE* frontData = NULL; BYTE* backData = NULL; BYTE* outputData = NULL; char outputName[26]; char outputRatio[11]; int i; int imageSize = readJpeg(frontName, &frontData); readJpeg(backName, &backData); outputData = (BYTE*) malloc(sizeof(BYTE) * imageSize); strcpy(outputName, "images/addition"); sprintf(outputRatio, "-%.0lf-%.0lf.jpg", frontRatio * 100, backRatio * 100); strcat(outputName, outputRatio); for (i = 0; i < imageSize; i++) { outputData[i] = (int) (frontData[i] * frontRatio + backData[i] * backRatio); } writeJpeg(outputName, outputData, readHeader(frontName, IMAGE_WIDTH), readHeader(frontName, IMAGE_HEIGHT), 3, 100); printf("%sを出力しました。\n", outputName); } /* 課題2-2 */ char* makeMaskImage(char* fileName, int d) { BYTE* data = NULL; // 人物像データ BYTE* mask = NULL; // 出力するマスク画像のデータ char* outputName; // マスク画像のファイル名 char stringD[8]; // マスク画像のファイル名のD値以降の名前を保存しておく用 /* 人物像データのサイズ、RGB各値の平均値などのデータ変数 */ int dataSize, pixel, aveR, aveG, aveB, ave = getRGBAverage("images/blue.jpg"); dataSize = readJpeg(fileName, &data); mask = (BYTE*) malloc(sizeof(BYTE) * dataSize); /* ここからファイル名に関する操作、課題とは直接関係はない */ outputName = (char*) malloc(sizeof(char) * 25); sprintf(stringD, "%d.jpg", d); strcpy(outputName, "images/result2-2-"); strcat(outputName, stringD); /* ファイル名に関する操作ここまで */ /* RGBそれぞれの平均を取得 */ aveR = (ave >> 16) & 255; aveG = (ave >> 8) & 255; aveB = ave & 255; printf("R: %d\n", aveR); printf("G: %d\n", aveG); printf("B: %d\n", aveB); /* マスク画像のデータを全て白色で初期化する */ for (pixel = 0; pixel < dataSize; pixel++) { mask[pixel] = 255; } /* RGBの値全てが平均値±Dの範囲内ならばマスク画像のデータを黒色にする */ for (pixel = 0; pixel < dataSize; pixel += 3) { if (aveR - d < data[pixel] && data[pixel] < aveR + d && aveG - d < data[pixel + 1] && data[pixel + 1] < aveG + d && aveB - d < data[pixel + 2] && data[pixel + 2] < aveB + d) { mask[pixel] = mask[pixel + 1] = mask[pixel + 2] = 0; } } /* 出力 */ writeJpeg(outputName, mask, readHeader(fileName, IMAGE_WIDTH), readHeader(fileName, IMAGE_HEIGHT), 3, 100); printf("%sを出力しました。\n", outputName); /* 返り値は課題2-3で用いているけど、別に直接課題とは関わりはない */ return outputName; } /* 引数で与えられて名前の画像ファイルのRGBそれぞれの平均値を ビット演算を用いることにより、1つのint型として返す */ int getRGBAverage(char* imageName) { int pixel, aveR = 0, aveG = 0, aveB = 0; BYTE* data = NULL; int dataSize = readJpeg(imageName, &data); for (pixel = 0; pixel < dataSize; pixel += 3) { aveR += data[pixel]; aveG += data[pixel + 1]; aveB += data[pixel + 2]; } dataSize /= 3; aveR /= dataSize; aveG /= dataSize; aveB /= dataSize; return ((aveR & 255) << 16) | ((aveG & 255) << 8) | (aveB & 255); } /* 課題2-3 */ void synthesizeByChromakey(char* frontName, char* backName, char* maskName) { BYTE* frontData = NULL; BYTE* backData = NULL; BYTE* maskData = NULL; BYTE* outputData = NULL; int pixel, dataSize; dataSize = readJpeg(frontName, &frontData); readJpeg(backName, &backData); readJpeg(maskName, &maskData); outputData = (BYTE*) malloc(sizeof(BYTE) * dataSize); for (pixel = 0; pixel < dataSize; pixel += 3) { if (maskData[pixel] > 230) { outputData[pixel] = frontData[pixel]; outputData[pixel + 1] = frontData[pixel + 1]; outputData[pixel + 2] = frontData[pixel + 2]; } else { outputData[pixel] = backData[pixel]; outputData[pixel + 1] = backData[pixel + 1]; outputData[pixel + 2] = backData[pixel + 2]; } } writeJpeg("images/result2-3.jpg", outputData, readHeader(frontName, IMAGE_WIDTH), readHeader(frontName, IMAGE_HEIGHT), 3, 100); printf("result2-3.jpgを出力しました。\n"); } int main(void) { char* frontName = "images/person.jpg"; char* backName = "images/back_official.jpg"; char maskName[25]; double frontRatio = 0.75; printf("課題2-1\n"); addTwoImageRGB(frontName, backName, frontRatio, 1 - frontRatio); printf("\n課題2-2\n"); free(makeMaskImage(frontName, 10)); free(makeMaskImage(frontName, 30)); strcpy(maskName, makeMaskImage(frontName, 50)); printf("\n課題2-3\n"); synthesizeByChromakey(frontName, backName, maskName); return 0; }