code: def save(img, filename, dtype_from="data"):
      """Write the image to a file.
  
      Parameters
      ----------
      img : An `Image` object
      filename : string
          Should be a valid filename.
      dtype_from : {'data', 'header'} or dtype specifier, optional
          Method of setting dtype to save data to disk. Value of 'data' (default),
          means use data dtype to save.  'header' means use data dtype specified
          in header, if available, otherwise use data dtype.  Can also be any
          valid specifier for a numpy dtype, e.g. 'i4', ``np.float32``.  Not every
          format supports every dtype, so some values of this parameter or data
          dtypes will raise errors.
  
      Returns
      -------
      image : An `Image` object
          Possibly modified by saving.
  
      See Also
      --------
      load_image : function for loading images
      Image : image object
  
      Examples
      --------
      Make a temporary directory to store files
  
      >>> import os
      >>> from tempfile import mkdtemp
      >>> tmpdir = mkdtemp()
  
      Make some some files and save them
  
      >>> import numpy as np
      >>> from nipy.core.api import Image, AffineTransform
      >>> from nipy.io.api import save_image
      >>> data = np.zeros((91,109,91), dtype=np.uint8)
      >>> cmap = AffineTransform('kji', 'zxy', np.eye(4))
      >>> img = Image(data, cmap)
      >>> fname1 = os.path.join(tmpdir, 'img1.nii.gz')
      >>> saved_img1 = save_image(img, fname1)
      >>> saved_img1.shape
      (91, 109, 91)
      >>> fname2 = os.path.join(tmpdir, 'img2.img.gz')
      >>> saved_img2 = save_image(img, fname2)
      >>> saved_img2.shape
      (91, 109, 91)
      >>> fname = 'test.mnc'
      >>> saved_image3 = save_image(img, fname)
      Traceback (most recent call last):
         ...
      ValueError: Sorry, we cannot yet save as format "minc"
  
      Finally, we clear up our temporary files:
  
      >>> import shutil
      >>> shutil.rmtree(tmpdir)
  
      Notes
      -----
      Filetype is determined by the file extension in 'filename'.  Currently the
      following filetypes are supported:
  
      * Nifti single file : ['.nii', '.nii.gz']
      * Nifti file pair : ['.hdr', '.hdr.gz']
      * SPM Analyze : ['.img', '.img.gz']
      """
      # Try and get nifti
      dt_from_is_str = isinstance(dtype_from, str)
      if dt_from_is_str and dtype_from == "header":
          # All done
          io_dtype = None
      elif dt_from_is_str and dtype_from == "data":
          io_dtype = img.get_fdata().dtype
      else:
          io_dtype = np.dtype(dtype_from)
      # make new image
      ni_img = nipy2nifti(img, data_dtype=io_dtype)
      ftype = _type_from_filename(filename)
      if ftype.startswith("nifti1"):
          ni_img.to_filename(filename)
      elif ftype == "analyze":
          try:
              ana_img = nib.Spm2AnalyzeImage.from_image(ni_img)
          except HeaderDataError:
              raise HeaderDataError(
                  "SPM analyze does not support datatype %s"
                  % ni_img.get_data_dtype()
              )
          ana_img.to_filename(filename)
      else:
          raise ValueError(
              f'Sorry, we cannot yet save as format "{ftype}"'
          )
      return img
  
file_path: nipy/nipy/io/files.py
imports: import os
  import nibabel
  import numpy
  from nibabel.spatialimages import HeaderDataError
  from ..core.image.image import is_image
  from .nibcompat import get_affine, get_dataobj, get_header
  from .nifti_ref import nifti2nipy, nipy2nifti
label_desc: Use image node_id 2 for calling a global function with example usage: save(img, filename, dtype_from) and returns: img