docs: def save(self, filename, fformat=None, fill_value=None, compute=True,
               keep_palette=False, cmap=None, **format_kwargs):
          """Save the image to the given *filename*.
  
          Args:
              filename (str): Output filename
              fformat (str): File format of output file (optional). Can be
                             one of many image formats supported by the
                             `rasterio` or `PIL` libraries ('jpg', 'png',
                             'tif'). By default this is determined by the
                             extension of the provided filename.
                             If the format allows, geographical information will
                             be saved to the ouput file, in the form of grid
                             mapping or ground control points.
              fill_value (float): Replace invalid data values with this value
                                  and do not produce an Alpha band. Default
                                  behavior is to create an alpha band.
              compute (bool): If True (default) write the data to the file
                              immediately. If False the return value is either
                              a `dask.Delayed` object or a tuple of
                              ``(source, target)`` to be passed to
                              `dask.array.store`.
              keep_palette (bool): Saves the palettized version of the image if
                                   set to True. False by default.
              cmap (Colormap or dict): Colormap to be applied to the image when
                                       saving with rasterio, used with
                                       keep_palette=True. Should be uint8.
              format_kwargs: Additional format options to pass to `rasterio`
                             or `PIL` saving methods.
  
          Returns:
              Either `None` if `compute` is True or a `dask.Delayed` object or
              ``(source, target)`` pair to be passed to `dask.array.store`.
              If compute is False the return value depends on format and how
              the image backend is used. If ``(source, target)`` is provided
              then target is an open file-like object that must be closed by
              the caller.
  
          """
          fformat = fformat or os.path.splitext(filename)[1][1:4]
          if fformat in ('tif', 'jp2') and rasterio:
              return self.rio_save(filename, fformat=fformat,
                                   fill_value=fill_value, compute=compute,
                                   keep_palette=keep_palette, cmap=cmap,
                                   **format_kwargs)
          else:
              return self.pil_save(filename, fformat, fill_value,
                                   compute=compute, **format_kwargs)