          """ Save an image """
          output_file = os.path.join(output_folder, filename)
          output_file = os.path.splitext(output_file)[0]+'.png'
          logger.trace("Saving image: '%s'", output_file)
          cv2.imwrite(output_file, image)  # pylint: disable=no-member
  
  
  class Faces(MediaLoader):
      """ Object to hold the faces that are to be swapped out """
  
 
</s> remove         output_file = os.path.splitext(output_file)[0]+'.png'
 </s> add         output_file = os.path.splitext(output_file)[0] + ".png" </s> remove     def save_image(output_folder, filename, image):
 </s> add     def save_image(output_folder, filename, image, metadata=None): </s> remove     """ Object to hold the faces that are to be swapped out """
 </s> add     """ Object to load Extracted Faces from a folder.

    Parameters
    ----------
    folder: str
        The folder to load faces from
    alignments: :class:`lib.align.Alignments`, optional
        The alignments object that contains the faces. Used to update legacy hash based faces
        for <v2.1 alignments to png header based version. Pass in ``None`` to not update legacy
        faces (raises error instead). Default: ``None``
    """
    def __init__(self, folder, alignments=None):
        self._alignments = alignments
        super().__init__(folder) </s> remove         """ Iterate through the faces folder pulling out various information """
 </s> add         """ Iterate through the faces folder pulling out various information for each face.

        Yields
        ------
        dict
            A dictionary for each face found containing the keys returned from
            :class:`lib.image.read_image_meta_batch`
        """ </s> remove         dst_dir = self.get_output_folder()
        filename = "{}{}_{}.txt".format(self.get_filename_prefix(),
 </s> add         dst_dir = self._get_output_folder()
        filename = "{}{}_{}.txt".format(self._get_filename_prefix(),
        if metadata:
            encoded_image = cv2.imencode(".png", image)[1]
            encoded_image = png_write_meta(encoded_image.tobytes(), metadata)
            with open(output_file, "wb") as out_file:
                out_file.write(encoded_image)
        else:
            cv2.imwrite(output_file, image)  # pylint: disable=no-member
          """ Save an image """
          output_file = os.path.join(output_folder, filename)
          output_file = os.path.splitext(output_file)[0]+'.png'
          logger.trace("Saving image: '%s'", output_file)
        if metadata:
            encoded_image = cv2.imencode(".png", image)[1]
            encoded_image = png_write_meta(encoded_image.tobytes(), metadata)
            with open(output_file, "wb") as out_file:
                out_file.write(encoded_image)
        else:
            cv2.imwrite(output_file, image)  # pylint: disable=no-member
  
  
  class Faces(MediaLoader):
      """ Object to hold the faces that are to be swapped out """
  
keep keep keep keep replace keep keep keep keep keep
 Update extracted faces to use PNG EXIF data (#1123)

Documentation
  - Update Usage.md, align.rst and image.rst
lib.image.py
  - read_image - Remove hash return, add metadata return
  - Remove read_image_hash functions
  - Add read_image_meta functios
  - Replace encode_image_with_hash with encode_image (to store metadata)
  - Add png meta reading and writing functions
  - Update Image Loaders/Savers to handle metadata rather than hashes
lib.training_data
  - Naming updates to remove references to hashes
lib.align.Alignments
  - Add versioning notes
  - Increment alignments version to 2.1
  - Deprecate hashing lookup functions
  - Replace filter_hashes with filter_faces
lib.align.detected_face
  - DetectedFace
    - Remove hash property
    - Add png header data serializing/deserializing functions
  - Mask
    - Add png header data serializing/deserializing functions
  - add update_legacy_png_header function to update png meta data
lib.cli.args - Deprecate alignments files for training
- plugins.train.trainer
  - Update alignments/mask code to read png header data
- scripts.convert
  - Aligned images folder - read data from png headers
- scripts.extract
  - Write png header information and no longer store hash of face
- tools.alignments
  - remove leftover-faces, merge and update-hashes jobs
  - Update jobs to use png meta data rather than hashes
- tools.manual
  - Update extract code to output png meta data and don't store hashes
  - Perform check on launch that tool is not pointing at a faces folder
tools.mask
  - Update to use png meta data
tools.sort
  - Update to use png meta data 
tools/alignments/media.py