/* $Id$ */ #include "gd.h" #include #include #include gdImagePtr loadImage(const char *name) { FILE *fp; gdImagePtr im; fp = fopen(name, "rb"); if (!fp) { fprintf(stderr, "Can't open jpeg file\n"); return NULL; } im = gdImageCreateFromJpeg(fp); fclose(fp); return im; } int savePngImage(gdImagePtr im, const char *name) { FILE *fp; fp = fopen(name, "wb"); if (!fp) { fprintf(stderr, "Can't save png image fromtiff.png\n"); return 0; } gdImagePng(im, fp); fclose(fp); return 1; } int main(int argc, char **arg) { gdImagePtr im, im2; int new_width, new_height; double angle, a2; if (argc < 3) { fprintf(stderr, "Usage: copyrotated [angle in degree] [filename.png]\n"); return 1; } angle = strtod(arg[1], 0); im = loadImage(arg[2]); if (!im) { fprintf(stderr, "Can't load PNG file <%s>", arg[1]); return 1; } /* cos adj hyp (cos = adjacent / hypothenus) sin op hyp (sin adjacent / hypothenus) + 10 pixels margin */ /* to radian */ a2 = angle * .0174532925; new_width = ceil(cos(a2) * gdImageSX(im)) + fabs(sin(a2) * gdImageSY(im)); new_height = ceil(cos(a2) * gdImageSY(im)) + fabs(sin(a2) * gdImageSX(im)); im2 = gdImageCreateTrueColor(new_width, new_height); if (!im2) { fprintf(stderr, "Can't create a new image"); gdImageDestroy(im); return 1; } gdImageAlphaBlending(im2, 0); gdImageFilledRectangle(im2, 0, 0, gdImageSX(im2), gdImageSY(im2), gdTrueColorAlpha(127,0,0,127)); gdImageCopyRotated(im2, im, new_width/2, new_height/2, 0, 0, gdImageSX(im), gdImageSY(im), angle); gdImageSaveAlpha(im2, 1); if (!savePngImage(im2, "rotated.png")) { fprintf(stderr, "Can't save PNG file rotated.png"); gdImageDestroy(im); gdImageDestroy(im2); return 1; } gdImageDestroy(im2); gdImageDestroy(im); return 0; }