54 static int ParseParams(
programparams *Param,
int argc,
char *argv[]);
60 puts(
"Image mosaicing utility, P. Getreuer 2010-2011\n");
61 puts(
"Usage: mosaic [options] <input file> <output file>\n\n"
64 puts(
" -p <pattern> CFA pattern, choices for <pattern> are");
65 puts(
" RGGB upperleftmost red pixel is at (0,0)");
66 puts(
" GRBG upperleftmost red pixel is at (1,0)");
67 puts(
" GBRG upperleftmost red pixel is at (0,1)");
68 puts(
" BGGR upperleftmost red pixel is at (1,1)\n");
69 puts(
" -f Flatten result to a grayscale image");
70 puts(
" -r Add one extra row to the top");
71 puts(
" -c Add one extra column to the left");
72 puts(
" -e <padding> Add <padding> pixels to each border of the image");
73 puts(
" -v Verbose output\n");
75 puts(
" -q <number> Quality for saving JPEG images (0 to 100)\n");
78 " mosaic -v -p RGGB frog.bmp frog-m.bmp");
88 static int WSymExtension(
int N,
int n)
102 int main(
int argc,
char *argv[])
105 image u = {NULL, 0, 0}, f = {NULL, 0, 0};
107 int i, x, y, xOffset, yOffset, Green, Status = 1;
112 if(!ParseParams(&Param, argc, argv))
115 Green = 1 - ((Param.
RedX + Param.
RedY) & 1);
125 if(!(f.Data = (uint32_t *)
Malloc(
sizeof(uint32_t)*f.Width*f.Height)))
132 printf(
"Resampling with pattern\n\n");
135 for(y = 0; y < f.Height; y++)
136 for(x = 0; x < f.Width; x++)
138 Pixel = u.
Data[WSymExtension(u.
Width, x - xOffset)
141 if(Param.
Verbose && x <= xOffset + 2 && y <= yOffset + 2)
143 if((x < MaxShow || x >= xOffset)
144 && (y < MaxShow || y >= yOffset))
146 if(y == yOffset && x == xOffset)
153 printf(
"%c", FillNext);
157 if(((x + y) & 1) == Green)
159 else if((y & 1) == Param.
RedY)
166 if(y == 0 || (yOffset > MaxShow && y == yOffset))
171 if(y == MaxShow - 1 && yOffset > MaxShow)
173 if(xOffset <= MaxShow)
186 if(x == MaxShow - 1 && xOffset > MaxShow)
196 if(((x + y) & 1) == Green)
197 ((uint8_t *)&Pixel)[0] = ((uint8_t *)&Pixel)[2] = 0;
198 else if((y & 1) == Param.
RedY)
199 ((uint8_t *)&Pixel)[1] = ((uint8_t *)&Pixel)[2] = 0;
201 ((uint8_t *)&Pixel)[0] = ((uint8_t *)&Pixel)[1] = 0;
205 if(((x + y) & 1) == Green)
206 ((uint8_t *)&Pixel)[0] =
207 ((uint8_t *)&Pixel)[2] = ((uint8_t *)&Pixel)[1];
208 else if((y & 1) == Param.
RedY)
209 ((uint8_t *)&Pixel)[1] =
210 ((uint8_t *)&Pixel)[2] = ((uint8_t *)&Pixel)[0];
212 ((uint8_t *)&Pixel)[0] =
213 ((uint8_t *)&Pixel)[1] = ((uint8_t *)&Pixel)[2];
216 ((uint8_t *)&Pixel)[3] = 255;
218 f.Data[x + f.Width*y] = Pixel;
225 if(xOffset > MaxShow)
243 printf(
"Output written to \"%s\".\n", Param.
OutputFile);
253 static int ParseParams(
programparams *Param,
int argc,
char *argv[])
255 static char *DefaultOutputFile = (
char *)
"out.bmp";
279 for(i = 1; i < argc;)
281 if(argv[i] && argv[i][0] ==
'-')
283 if((OptionChar = argv[i][1]) == 0)
290 OptionString = &argv[i][2];
292 OptionString = argv[i];
302 if(!strcmp(OptionString,
"RGGB")
303 || !strcmp(OptionString,
"rggb"))
308 else if(!strcmp(OptionString,
"GRBG")
309 || !strcmp(OptionString,
"grbg"))
314 else if(!strcmp(OptionString,
"GBRG")
315 || !strcmp(OptionString,
"gbrg"))
320 else if(!strcmp(OptionString,
"BGGR")
321 || !strcmp(OptionString,
"bggr"))
327 ErrorMessage(
"CFA pattern must be RGGB, GRBG, GBRG, or BGGR\n");
334 Param->
Padding = atoi(OptionString);
361 ErrorMessage(
"JPEG quality must be between 0 and 100.\n");
370 if(isprint(OptionChar))