diff --git a/sys/man/1/resample b/sys/man/1/resample index 35968d054..391f4a654 100644 --- a/sys/man/1/resample +++ b/sys/man/1/resample @@ -1,6 +1,6 @@ .TH RESAMPLE 1 .SH NAME -resample \- resample a picture +resample, resize - resample a picture .SH SYNOPSIS .B resample [ @@ -12,11 +12,27 @@ resample \- resample a picture ] [ .I file ] +.br +.B resize +[ +.B -x +.I size +] [ +.B -y +.I size +] [ +.I file +] .SH DESCRIPTION .I Resample +and +.I Resize resamples its input image (default standard input) to a new size. -The image is decimated or interpolated using -a Kaiser window. +.I Resample +uses a Kaiser window which produces high quality results and +.I resize +uses bilinear interpolation which is faster but produces more +fuzzy images. .PP The size of the resampled image can be specified with the @@ -24,7 +40,8 @@ with the and .B -y options. -An unadorned value sets the number of pixels of that dimension; a suffixed percent sign specifies a percentage. +An unadorned value sets the number of pixels of that dimension; a +suffixed percent sign specifies a percentage. If only one of .B -x or @@ -51,8 +68,8 @@ To uncompress the image or change the pixel format, use .PP .SH SOURCE .B /sys/src/cmd/resample.c +.br +.B /sys/src/cmd/resize.c .SH "SEE ALSO .IR crop (1), .IR image (6) -.SH BUGS -Faster algorithms exist, but this implementation produces correct pictures. diff --git a/sys/man/1/rotate b/sys/man/1/rotate new file mode 100644 index 000000000..498e02fda --- /dev/null +++ b/sys/man/1/rotate @@ -0,0 +1,36 @@ +.TH ROTATE 1 +.SH NAME +rotate - rotate or mirror a picture +.SH SYNOPSIS +.B rotate +[ +.B -r +.I degree +] [ +.B -u | +.B -l +] [ +.I file +] +.SH DESCRIPTION +.I Rotate +reads its input image (default from standard input), applies the rotation +or mirroring and outputs the transformed image in compressed +plan9 bitmap format. +.PP +The option +.B -r +rotates the image clockwise in 90 degree steps by the +.I degree +argument. +The options +.B -u +and +.B -l +mirror the image upside/down or left/right. +.SH SOURCE +.B /sys/src/cmd/rotate.c +.SH "SEE ALSO +.IR crop (1), +.IR resample (1), +.IR image (6) diff --git a/sys/src/cmd/resize.c b/sys/src/cmd/resize.c index a66cd90c7..626097eeb 100644 --- a/sys/src/cmd/resize.c +++ b/sys/src/cmd/resize.c @@ -70,10 +70,25 @@ resample(Memimage *dst, Rectangle r, Memimage *src, Rectangle sr) } } +enum { + PERCENT = 0x80000000, +}; + +static int +getsize(char *s) +{ + int v; + + v = strtol(s, &s, 10) & ~PERCENT; + if(*s == '%') + v |= PERCENT; + return v; +} + void usage(void) { - sysfatal("Usage: %s [ -x width ] [ -y height ] [image]\n", argv0); + sysfatal("Usage: %s [ -x width ] [ -y height ] [ file ]\n", argv0); } void @@ -86,11 +101,14 @@ main(int argc, char **argv) xsize = ysize = 0; ARGBEGIN{ + case 'a': + xsize = ysize = getsize(EARGF(usage())); + break; case 'x': - xsize = atoi(EARGF(usage())); + xsize = getsize(EARGF(usage())); break; case 'y': - ysize = atoi(EARGF(usage())); + ysize = getsize(EARGF(usage())); break; default: usage(); @@ -104,6 +122,10 @@ main(int argc, char **argv) memimageinit(); if((im = readmemimage(fd)) == nil) sysfatal("readmemimage: %r"); + if(xsize & PERCENT) + xsize = ((xsize & ~PERCENT) * Dx(im->r)) / 100; + if(ysize & PERCENT) + ysize = ((ysize & ~PERCENT) * Dy(im->r)) / 100; if(xsize || ysize){ if(ysize == 0) ysize = (xsize * Dy(im->r)) / Dx(im->r);