178 lines
5.8 KiB
C
178 lines
5.8 KiB
C
/*
|
|
#define GRAVITY_CENTER 0
|
|
#define GRAVITY_EAST 1
|
|
#define GRAVITY_NORTHEAST 2
|
|
#define GRAVITY_NORTH 3
|
|
#define GRAVITY_NORTHWEST 4
|
|
#define GRAVITY_SOUTHEAST 5
|
|
#define GRAVITY_SOUTH 6
|
|
#define GRAVITY_SOUTHWEST 7
|
|
#define GRAVITY_WEST 8
|
|
*/
|
|
#define NUM_GRAVITIES 9
|
|
|
|
/* gravity options for cropped output - center (typical) */
|
|
char *geometry[] = {
|
|
"Center",
|
|
"East",
|
|
"NorthEast",
|
|
"North",
|
|
"NorthWest",
|
|
"SouthEast",
|
|
"South",
|
|
"SouthWest",
|
|
"West",
|
|
NULL};
|
|
|
|
char *gravity = "center";
|
|
|
|
/* command line helper function to set ImageMagick geometry for gravity option */
|
|
void SetMagickAspectScript(char *wordptr)
|
|
{
|
|
int idx;
|
|
|
|
if (wordptr[0] != (char) 0) {
|
|
for (idx = 0;idx < NUM_GRAVITIES;idx++) {
|
|
if (cmpstr(wordptr,geometry[idx]) == SUCCESS) {
|
|
gravity = (char *) &geometry[idx][0];
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* args are image file name, type of output 0 or 1 (.bat or .sh),
|
|
and whether output is cropped 0 or padded 1 */
|
|
int MakeMagickAspectScript(char *name,int script, int pad)
|
|
{
|
|
FILE *fp, *fp2=NULL;
|
|
char buf[128], c, d, idfile[256], outfile[256];
|
|
int i, j, status = 1;
|
|
float fwidth, fheight;
|
|
int width, height, cropwidth, cropheight, xtent;
|
|
|
|
/* use image file base name for id file name and batch file or script file name */
|
|
strcpy(idfile,name);
|
|
strcpy(outfile,name);
|
|
j = 999;
|
|
for (i=0;name[i]!=(char)0;i++){
|
|
if (name[i] == '.')j=i;
|
|
}
|
|
|
|
/* the image file name must have an extension */
|
|
if (j==999) return status;
|
|
idfile[j] = outfile[j]=(char)0;
|
|
|
|
/* the id file must already exist */
|
|
strcat(idfile,".id");
|
|
fp = fopen(idfile,"r");
|
|
if (fp == NULL) return status;
|
|
|
|
if (script == 0) strcat(outfile,".bat");
|
|
else strcat(outfile,".sh");
|
|
|
|
for (;;) {
|
|
if (NULL == fgets(buf, 128, fp)) {
|
|
fclose(fp);
|
|
break;
|
|
}
|
|
nocr(buf);
|
|
/* this parser is really simplistic... it uses the first widthxheight string preceded by a space...
|
|
it will probably usually work since we don't usually put widthxheight strings in filenames */
|
|
width = height = 0;
|
|
d = (char)0;
|
|
for (i=0;buf[i]!=(char)0;i++){
|
|
if (d == (char)32) {
|
|
width = atoi((char *)&buf[i]);
|
|
}
|
|
c = buf[i];
|
|
if (c=='x' && width > 0) {
|
|
if (d > (char)47 && d < (char)58) {
|
|
height = atoi((char *)&buf[i+1]);
|
|
if (height > 0) break;
|
|
}
|
|
}
|
|
d = c;
|
|
}
|
|
if (width == 0) break;
|
|
if (height == 0) break;
|
|
if (pad == 0) {
|
|
/* cropping (not padding) */
|
|
/* for widescreen images trim both sides, the height remains the same */
|
|
fwidth = (float)1.3334 * height;
|
|
cropwidth = (int)fwidth;
|
|
if (cropwidth > width) {
|
|
/* if the cropping width is not 1/3 greater than the height, this is a portrait image
|
|
and must be cropped in the vertical axis only */
|
|
cropwidth = width;
|
|
fheight = (float)0.75 * width;
|
|
cropheight = (int)fheight;
|
|
}
|
|
else {
|
|
cropheight = height;
|
|
}
|
|
}
|
|
else {
|
|
fheight = (float)0.75 * width;
|
|
cropheight = (int)fheight;
|
|
if (cropheight == height) {
|
|
/* if the height is equal to 75% of the width, the output is verbatim (no padding is needed) */
|
|
cropwidth = width;
|
|
pad = 0;
|
|
}
|
|
else if (height < cropheight) {
|
|
/* if the height is less than 75% of the width, the output is letterboxed with padding above and below */
|
|
xtent = cropwidth = width;
|
|
}
|
|
else {
|
|
/* if the height is greater than 75% of the width, the output is pillarboxed with padding on the sides */
|
|
cropheight = height;
|
|
fwidth = (float)1.3334 * height;
|
|
xtent = cropwidth = (int)fwidth;
|
|
}
|
|
}
|
|
fp2 = fopen(outfile,"w");
|
|
if (NULL == fp2) break;
|
|
|
|
if (script == 0) {
|
|
/* batch file output */
|
|
fprintf(fp2,"@echo off\n");
|
|
if (pad == 0) {
|
|
/* %MAGICK% %%f -gravity center -crop 1440x1080+0+0 -define format:BMP %%~nf.bmp */
|
|
fprintf(fp2,"%%1 %%2 -gravity %s -crop %dx%d+0+0 -define format:BMP %%3.bmp\n",gravity,cropwidth,cropheight);
|
|
}
|
|
else {
|
|
/* letterbox */
|
|
/* %MAGICK% %%f -gravity center -background black -extent 1920x1920 -crop 1920x1440+0+0 +repage -define format:BMP %%~nf.bmp */
|
|
/* pillarbox */
|
|
/* %MAGICK% %%f -gravity center -background black -extent 2730x2730 -crop 2730x2048+0+0 +repage -define format:BMP %%~nf.bmp */
|
|
fprintf(fp2,
|
|
"%%1 %%2 -gravity %s -background black -extent %dx%d -crop %dx%d+0+0 +repage -define format:BMP %%3.bmp\n",
|
|
gravity,xtent,xtent,cropwidth,cropheight);
|
|
|
|
}
|
|
}
|
|
else {
|
|
/* shell script output */
|
|
fprintf(fp2,"#!/bin/sh\n");
|
|
if (pad == 0) {
|
|
/* $MAGICK $src -gravity center -crop 1440x1080+0+0 -define format:BMP $tgt.bmp */
|
|
fprintf(fp2,"$1 $2 -gravity %s -crop %dx%d+0+0 -define format:BMP $3.bmp\n",gravity,cropwidth,cropheight);
|
|
}
|
|
else {
|
|
fprintf(fp2,
|
|
"$1 $2 -gravity %s -background black -extent %dx%d -crop %dx%d+0+0 +repage -define format:BMP $3.bmp\n",
|
|
gravity,xtent,xtent,cropwidth,cropheight);
|
|
|
|
}
|
|
}
|
|
status = 0;
|
|
}
|
|
fclose(fp);
|
|
if (NULL != fp2) fclose(fp2);
|
|
|
|
return status;
|
|
}
|
|
|