かきかたえんぴつ

いつかどこかで何かの役にたつかもしれないメモ

Cairo で PDF に埋め込んだビットマップがボケる

Cairo 1.10 以降でビットマップ画像を埋め込んだ PDF を作ると、その画像にデフォルトで /Interpolate true フラグが設定される。画像の解像度が低いとピクセルの境目がボケているのが見えてしまう。これを回避するには、CAIRO_FILTER_NEAREST フィルタを設定する。たとえば、

cairo_surface_t* cs = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height);
// ...
cr = cairo_create(cs);
// ...
cairo_set_source_surface(cr, img, 0, 0);
cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST);
cairo_paint(cr);

Inkscape は PDF 出力に Cairo を使っているので、最近の Inkscape が吐いた PDF でも /Interpolate true が設定されてしまう。どうにかならんかなー。