[cairo] Converting to 8 bit black and white

Ben ben.lists at bsb.me.uk
Tue Sep 25 08:52:02 PDT 2012


May be too late...

On Tue, 2012-09-18 at 13:36 -0500, Timothy Bolton wrote:

> I have another question.  How do you convert a surface from color to 8 
> bit black and white?  I've been searching and I cannot seem to find a 
> way to convert a surface to black and white.
> 
> I'm pulling in images, and I need them to be black and white (not gray 
> scale) for the rendering.

If you use CAIRO_OPERATOR_HSL_COLOR with a grey source you get a
grey-scale image.  You can then threshold it by adding and burning with
the darkest non-black source you can construct:

  cairo_t *cp = cairo_create(surf);
  cairo_set_source_rgb(cp, t, t, t);
  cairo_set_operator(cp, CAIRO_OPERATOR_HSL_COLOR);
  cairo_paint(cp);
  cairo_set_operator(cp, CAIRO_OPERATOR_ADD);
  cairo_paint(cp);
  cairo_set_source_rgb(cp, DBL_MIN, DBL_MIN, DBL_MIN);
  cairo_set_operator(cp, CAIRO_OPERATOR_COLOR_BURN);
  cairo_paint(cp);

t is the level below which the result will be black.

There may be a neater way to do this, but this method was the first that
came to mind (I tend to stop once I have any solution).

-- 
Ben



More information about the cairo mailing list