[cairo] antialias for images?

Jeff Muizelaar jeff at infidigm.net
Mon Oct 15 10:28:51 PDT 2007


I haven't looked any images, so I could be talking about the wrong
thing. Cairo uses a constant number of source pixels for each
destination pixel, so when scaling down by a large amount there will be
artifacting because information is being discarded.

-Jeff

On Mon, Oct 15, 2007 at 07:24:03PM +0200, Peter Goetz wrote:
> As you already supposed I started with a high resolution source image.
> I also change the order of rotation and scale. With no success.
> Even if I don't rotate at all and just scale the image down, I get a
> non-antialiased result.
> 
> Any suggestions? Thanks again for help!
> 
> 
> 2007/10/15, Thomas Stover <thomas at wsinnovations.com>:
> >
> > > Date: Mon, 15 Oct 2007 01:24:35 +0200
> > > From: "Peter Goetz" <peter.gtz2 at gmail.com>
> > > Subject: [cairo] antialias for images?
> > > To: cairo at cairographics.org
> > > Message-ID:
> > >       <64acc4780710141624ye4eadcbq4d6a91999c86ca5c at mail.gmail.com>
> > > Content-Type: text/plain; charset="iso-8859-1"
> > >
> > > Hi all,
> > > I'm trying to scale and rotate an image and then put it on a surface
> > > using paint as it is shown in one of the examples.
> > > However the scaling is not done by something like a bicubic filter but
> > > just by a linear one, so the picture looks very noisy (see screenshot
> > > attached) and has a staircase effect on the edges.
> > > Is there a way to make it look smooth? Some antialias for images? I
> > > haven't found something in the mail-archives.
> > > Thanks for your help!
> > > Peter
> > >
> > > Source-code:
> > >
> > > #include <cairo.h>
> > >
> > > int main (int argc, char *argv[])
> > > {
> > >        cairo_surface_t *surface;
> > >        cairo_t *cr;
> > >        int w, h;
> > >        cairo_surface_t *image;
> > >
> > >        surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 256, 256);
> > >        cr = cairo_create (surface);
> > >
> > >        double M_PI=3.14;
> > >
> > >        image = cairo_image_surface_create_from_png ("test.png");
> > >        w = cairo_image_surface_get_width (image);
> > >        h = cairo_image_surface_get_height (image);
> > >
> > >        cairo_translate (cr, 128.0, 128.0);
> > >        cairo_rotate (cr, 20* M_PI/180);
> > >        cairo_scale  (cr, 256.0/w, 256.0/h);
> > >        cairo_translate (cr, -0.5*w, -0.5*h);
> > >
> > >        cairo_set_source_surface (cr, image, 0, 0);
> > >        cairo_paint (cr);
> > >
> > >        cairo_surface_destroy (image);
> > >
> > >        cairo_destroy (cr);
> > >        cairo_surface_write_to_png (surface, "output.png");
> > >        cairo_surface_destroy (surface);
> > >
> > >        return 0;
> > > }
> > > -------------- next part --------------
> > > A non-text attachment was scrubbed...
> > > Name: output.png
> > > Type: image/png
> > > Size: 47960 bytes
> > > Desc: not available
> > > Url : http://lists.cairographics.org/archives/cairo/attachments/20071015/cb14c4d6/attachment.png
> >
> > Note: I'm new to cairo myself, and this answer is based on nothing but
> > intuition.
> >
> > I think if the source image "test.png" is low-res then there is not much
> > that can be done. However, if you start out with a higher resolution
> > source image (maybe you are already), then do your rotation and effects
> > at a high resolution inside cairo, then as the very last step scale the
> > end result down to the smaller size you want - it might look better. In
> > other words, first try doing the rotation on a 600x600 file on say a
> > 1000x100 cairo surface with no other translate or scales, and just see
> > what it looks like. If that looks better, then I think it's a matter of
> > finding the right sequence of scale/rotate/translate/matrix operations
> > that cairo likes to do everything at high res except for the final scale
> > down to 256x256.
> >
> > This sounds like something I would want to do myself, let us know what
> > happens.
> >
> >
> >
> > _______________________________________________
> > cairo mailing list
> > cairo at cairographics.org
> > http://lists.cairographics.org/mailman/listinfo/cairo
> >
> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo


More information about the cairo mailing list