def pillow(values: dict, step_data: StepData, prev_paths: dict):
    """
    Erstellt ein Bild mit Hilfe der Python-Bibliothek Pillow.
    Dazu wird ein neues Bild geöffnet oder ein bisher erstelltes Bild weiter bearbeitet.
    In der JSON können beliebige viele Overlays angegeben werden, welche diese Methode alle
    ausführt und auf das Bild setzt.

    :param values: Image-Bauplan des zu erstellenden Bildes
    :param step_data: Daten aus der API
    :param prev_paths: alle Image-Baupläne und somit auch alle Pfade zu den bisher erstellten Bildern
    :return: Pfad zum erstellten Bild
    :rtype: str
    """
    if values.get("path", None) is None:
        image_name = step_data.format(values["image_name"])
        source_img = Image.open(
            resources.get_resource_path(prev_paths[image_name]))
    else:
        path = step_data.format(values["path"])
        source_img = Image.open(resources.get_image_path(path))
    img1 = Image.new("RGBA", source_img.size)
    draw = ImageDraw.Draw(source_img)

    for overlay in values["overlay"]:
        over_func = get_type_func(overlay, OVERLAY_TYPES)
        over_func(overlay, step_data, source_img, prev_paths, draw)

    file = resources.new_temp_resource_path(step_data.data["_pipe_id"], "png")
    Image.composite(img1, source_img, img1).save(file)
    return file
    def __cleanup(self):
        if self.__no_tmp_dir:
            return

            # delete directory
        logger.info("Cleaning up...")
        shutil.rmtree(resources.get_temp_resource_path("", self.id),
                      ignore_errors=True)
        files = glob.glob(resources.get_image_path("diagrams") + "/*")
        for f in files:
            os.remove(f)
        logger.info("Finished cleanup!")
def generate_diagram_custom(values: dict,
                            step_data: StepData):  # , prev_paths):
    """
    Erstellt ein Diagramm

    :param values: Konfigurations-Dict für ein Diagramm
    :param step_data: Daten der Pipeline

    :return: Pfad zu dem erstellten Diagramm
    """
    file = resources.get_image_path(
        f"diagrams/{values['diagram_config']['infoprovider']}_{values['diagram_config']['name']}.png"
    )
    with resources.open_resource(file, "wt") as f:
        pass

    plot_wrapper(values["diagram_config"], file, step_data)

    return file
def image(overlay: dict, step_data: StepData, source_img, prev_paths, draw):
    """
    Methode, um ein Bild in das `source_img` einzufügen, mit dem Bauplan, der in overlay vorgegeben ist.

    :param overlay: Bauplan des zu schreibenden Overlays
    :param step_data: Daten aus der API
    :param source_img: Bild, auf welches das Bild eingefügt werden soll
    :param prev_paths: Alle Image-Baupläne und somit auch alle Pfade zu den bisher erstellen Bildern
    :param draw: Draw-Objekt
    """
    if overlay.get("path", None) is None:
        image_name = step_data.format(overlay["image_name"])
        path = resources.get_resource_path(prev_paths[image_name])
    else:
        path = resources.get_image_path(step_data.format(overlay["path"]))
    icon = Image.open(path).convert("RGBA")
    if overlay.get("color_transparency", None) is not None:
        _color_to_transparent(icon,
                              step_data.format(overlay["color_transparency"]))
    if step_data.format(overlay.get("color", "RGBA")) != "RGBA":
        icon = icon.convert(step_data.format(overlay["color"]))
    if overlay.get("size_x", None) is not None and overlay.get(
            "size_y", None) is not None:
        icon = icon.resize([
            step_data.get_data(overlay["size_x"], None, numbers.Number),
            step_data.get_data(overlay["size_y"], None, numbers.Number)
        ], Image.LANCZOS)
    if overlay.get("pos_x", None) is not None and overlay.get(
            "pos_y", None) is not None:
        pos_x = step_data.get_data(overlay["pos_x"], None, numbers.Number)
        pos_y = step_data.get_data(overlay["pos_y"], None, numbers.Number)
    else:
        width_b, height_b = source_img.size
        width_i, height_i = icon.size
        pos_x = int(round((width_b - width_i) / 2))
        pos_y = int(round((height_b - height_i) / 2))
    if step_data.get_data(overlay.get("transparency", False), None, bool):
        source_img.alpha_composite(icon, (pos_x, pos_y))
    else:
        source_img.paste(icon, (pos_x, pos_y), icon)