docstr: add an image
  
  Args:
      src (str): image path
      alt (str): image attribute
      width (int): width of image
      height (int): height of image
  Returns: HTML String
code: def add_image(src: str, alt: str, *, width=None, height=None):
      """
      add an image
  
      Args:
          src (str): image path
          alt (str): image attribute
          width (int): width of image
          height (int): height of image
      Returns: HTML String
      """
      import base64
  
      with open(src, "rb") as image_file:
          encoded_string = base64.b64encode(image_file.read())
      doc = Doc()
      with doc.tag("img"):
          doc.attr(
              src="data:image/png;base64, %s"
              % encoded_string.decode("utf-8")
          )
          doc.attr(alt=alt)
          if not (width is None):
              doc.attr(width=str(width))
          if not (height is None):
              doc.attr(height=str(height))
      return doc.getvalue()
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import os
  import datetime
  from yattag import Doc, indent
label_desc: Use image node_id 20 for calling the CustomHtml obj's underlying member method code with example usage: obj.add_image(src, alt) and returns: doc