チーム19B2
課題名
複数画像フィルタ処理
研究者名
Tonaki Mizuki
Onda Takashi
見出し1
チーム19A1を参考に互いに干渉しないフィルタを同時に実行することができるようにした。
例えば、拡大フィルタ、上下反転フィルタ、左右反転フィルタ、モザイクフィルタ、グレースケールフィルタを一度に
実行することができる。
実行環境は自分のPCのWSL上で行った。
ソース
#include <gd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int width, height, i, j, color, r, g, b, pixel, gray;
int rr=255,gg=255,bb=255;
int mode=-1;
double dx=1,dy=1;
int moz=1;
int rev_x=0,rev_y=0;
void get_color(int x,int y,gdImagePtr im){
pixel = gdImageGetPixel(im, x, y); r = gdImageRed(im, pixel); g = gdImageGreen(im, pixel); b = gdImageBlue(im, pixel);
r= (r>rr)?rr:r; g= (g>gg)?gg:g; b= (b>bb)?bb:b;
}
void set_color(){
//グレースケール化 if(mode==1){ gray = (77*r + 151*g + 28*b) / 256; r = gray; g = gray; b = gray; } //ネガ化 if(mode==2){ r = 255-r; g = 255-g; b = 255-b; } //赤の鮮明化 if(mode==3 && r != 255 && g > 25 && b > 25){ gray = (77*r + 151*g + 28*b) / 256; r = gray; g = gray; b = gray; } //緑の鮮明化 if(mode==4 && r > 10 && g != 255 && b > 75){ gray = (77*r + 151*g + 28*b) / 256; r = gray; g = gray; b = gray; } //青の鮮明化 if(mode==5 && r > 45 && g >20 && b != 255){ gray = (77*r + 151*g + 28*b) / 256; r = gray; g = gray; b = gray; }
}
void create_image(gdImagePtr im,gdImagePtr im_new){
for(i=0;i<width;i++){ for(j=0;j<height;j++){ int y = rev_y?width-i:i; int x = rev_x?height-j:j; y/=dy; x/=dx;
//適切な位置から色を採る get_color((y/moz)*moz,(x/moz)*moz,im); //新しい画像の色を決める set_color();
color=gdImageColorExact(im_new,r,g,b);
gdImageSetPixel(im_new,i,j,color); } }
}
int main(const int argc, const char *argv[]){
FILE *in,*out; gdImagePtr im, im_new;
if(argv[1] == NULL | | argv[2] == NULL | | !strcmp(argv[1], argv[2])){ printf("argument error\n"); exit(-1); }
if((in = fopen(argv[1], "r")) == NULL){ printf("file open error for %s\n", argv[1]); exit(-1); } if((out = fopen(argv[2], "wb")) == NULL){ printf("file open error for %s\n", argv[2]); exit(-1); }
im = gdImageCreateFromJpeg(in);
width = gdImageSX(im); height = gdImageSY(im);
while(!(0<=mode&&mode<=5)){ printf("モードの指定 0から10 : "); scanf("%d", &mode);
//色の最大値を決めるモード if(mode==6){ printf("赤色の最大 : "); scanf("%d",&rr); printf("緑色の最大 : "); scanf("%d",&gg); printf("青色の最大 : "); scanf("%d",&bb); }
// 縦横の伸縮をするモード7 if(mode==7){ printf("縦幅 : "); scanf("%lf",&dx); printf("横幅 : "); scanf("%lf",&dy); }
//モザイクフィルタをつけるモード8 if(mode==8){ printf("モザイクの粗さ : "); scanf("%d",&moz); }
//左右反転モード if(mode==9){ printf("左右反転\n"); rev_y=rev_y?0:1; } //上下反転モード if(mode==10){ printf("上下反転\n"); rev_x=rev_x?0:1; }
if(mode>=11){ printf("10以下の数字を入れてください\n"); }
}
width*=dy; height*=dx; im_new = gdImageCreateTrueColor(width,height);
create_image(im,im_new);
gdImageJpeg(im_new,out,-1); fclose(in); fclose(out);
return 0;
}
実行結果
以下のように様々なフィルタの掛け合わせができる
考察
他にも様々なフィルタを実装することにより、もっと複雑な画像を出力することが
可能である。そのため、さらに時間があればより良いプログラムにすることが
可能であったと考えられる。
- 最終更新:2019-06-17 18:29:26