// Encode image.Image with Mapniks image encoder. func Encode(img image.Image, format string) ([]byte, error) { var i *C.mapnik_image_t switch img := img.(type) { // XXX does mapnik expect NRGBA or RGBA? this might stop working //as expected if we start encoding images with full alpha channel case *image.NRGBA: i = C.mapnik_image_from_raw( (*C.uint8_t)(unsafe.Pointer(&img.Pix[0])), C.int(img.Bounds().Dx()), C.int(img.Bounds().Dy()), ) case *image.RGBA: i = C.mapnik_image_from_raw( (*C.uint8_t)(unsafe.Pointer(&img.Pix[0])), C.int(img.Bounds().Dx()), C.int(img.Bounds().Dy()), ) } if i == nil { return nil, errors.New("unable to create image from raw") } defer C.mapnik_image_free(i) cformat := C.CString(format) b := C.mapnik_image_to_blob(i, cformat) if b == nil { return nil, errors.New("mapnik: " + C.GoString(C.mapnik_image_last_error(i))) } C.free(unsafe.Pointer(cformat)) defer C.mapnik_image_blob_free(b) return C.GoBytes(unsafe.Pointer(b.ptr), C.int(b.len)), nil }
// Render returns the map as an encoded image. func (m *Map) Render(opts RenderOpts) ([]byte, error) { scaleFactor := opts.ScaleFactor if scaleFactor == 0.0 { scaleFactor = 1.0 } i := C.mapnik_map_render_to_image(m.m, C.double(opts.Scale), C.double(scaleFactor)) if i == nil { return nil, m.lastError() } defer C.mapnik_image_free(i) if opts.Format == "raw" { size := 0 raw := C.mapnik_image_to_raw(i, (*C.size_t)(unsafe.Pointer(&size))) return C.GoBytes(unsafe.Pointer(raw), C.int(size)), nil } var format *C.char if opts.Format != "" { format = C.CString(opts.Format) } else { format = C.CString("png256") } b := C.mapnik_image_to_blob(i, format) if b == nil { return nil, errors.New("mapnik: " + C.GoString(C.mapnik_image_last_error(i))) } C.free(unsafe.Pointer(format)) defer C.mapnik_image_blob_free(b) return C.GoBytes(unsafe.Pointer(b.ptr), C.int(b.len)), nil }