# Scripts Magick
# Compression de tuiles JPEG
# Transformation de l'espace colorimétrique

# 1.  Préparer l'interface -----------------
# 1.1 Charger les librairies ===============
library(here)
library(tidyverse)
# images
# devtools::install_github("https://github.com/MatthiasCarnein/jpegToolbox")
library(jpegToolbox)
library(rsvg)
library(magick)
# Gestion des polices de caractère des images
# library(showtext)
# Import de tables
library (readxl)
library(openxlsx)
# gestion des conflits entre packages
library(conflicted)
conflict_prefer("filter", "dplyr")
# webographie : https://stackoverflow.com/questions/56411834/unable-to-find-an-inherited-method-for-function-select-for-signature-data-fr

# 1.2 Gérer ses polices de caractères personelles ===============
# #Importer et afficher avec showtext
# # Vérifier le chemin d'installation des polices sur le système
# font_paths()
# # Ajouter la police
# font_add(family = "DejaVuSans", regular = "C://Windows//Fonts/DejaVuSans.ttf", bold ="C://Windows//Fonts/DejaVuSans-Bold.ttf", italic = "C://Windows//Fonts/DejaVuSans-Oblique.ttf", bolditalic = "C://Windows//Fonts/DejaVuSans-BoldOblique.ttf" )
# font_add(family = "DejaVuSansCondensed", regular = "C://Windows//Fonts/DejaVuSansCondensed.ttf", bold ="C://Windows//Fonts/DejaVuSansCondensed-Bold.ttf", italic = "C://Windows//Fonts/DejaVuSansCondensed-Oblique.ttf", bolditalic = "C://Windows//Fonts/DejaVuSansCondensed-BoldOblique.ttf" )
# # regarder les familles installées sur le systèmepour vérifier que ces familles ont été ajoutées
# sysfonts::font_families()
# # Activer showtext pour l'ensemble des graphiques du script
# showtext_auto()

# 1.3 Encoder les données ===============
locale( encoding = "UTF-8")

# désactiver le format scientifique des nombres par défaut
options(scipen = 999)

# 1.4 Déclarer la racine du projet =============================================
here::i_am("Villeurbanne_morphologie/00-R_scripts/Villeurbanne_morphologie.R")

# 1.5 Travailler sur le script ===================================
# Pour transformer un code en commentaire ou un commentaire en code
# Sélectionner les lignes de codes concernées PUIS Ctrl+Shift+c

# 2.0 Charger les tuiles ==========================================
# https://docs.ropensci.org/magick/
# https://cloud.r-project.org/web/packages/magick/magick.pdf

# Essai sur une image
magick_config()
autoviewer_enable()
coder_info("jpeg")

tiger <- image_read_svg('http://jeroen.github.io/images/tiger.svg', width = 350)
image_browse(tiger)
tiger_png <- image_convert(tiger, "png")
image_info(tiger_png)
image_browse(tiger_png)

# Colorspace : YCbCr
tiger_jpeg <- image_convert(tiger, 
                            format = "jpeg", 
                            colorspace = "YCbCr",
                            depth=8, 
                            matte=TRUE, 
                           interlace = "Plane")
image_info(tiger_jpeg)
image_browse(tiger_jpeg)

# https://imagemagick.org/script/formats.php#colorspace
colorspace_types()

image_write(
  tiger_jpeg,
  path = "./tiger.jpeg",
  format = "jpeg", 
  quality = 100,
  depth = 8,
  density = 96,
  flatten = TRUE,
  defines = c("jpeg:colorspace" ="YCbCr"),
  compression = "JPEG")

tiger_jpeg2 <- image_read("./tiger.jpeg")

image_info(tiger_jpeg2)
# Magick ne semble pas vouloir écrire de jpeg en Ycbcr alors qu'il est capable de le créer dans dans le temp_dir

# Colorspace : CMJK
tiger_jpeg3 <- image_convert(tiger, 
                            format = "jpeg", 
                            colorspace = "CMYK",
                            depth=8, 
                            matte=TRUE, 
                            interlace = "Plane")

image_info(tiger_jpeg3)
image_browse(tiger_jpeg3)

image_write(
  tiger_jpeg3,
  path = "./tiger3.jpeg",
  format = "jpeg", 
  quality = 100,
  depth = 8,
  density = 96,
  flatten = TRUE,
  defines = c("jpeg:colorspace" ="CMJK", "jpeg:profile" ="CMJK.icc"),
  compression = "JPEG")

tiger_jpeg3 <- image_read("./tiger3.jpeg")

image_info(tiger_jpeg3)
image_browse(tiger_jpeg3)

# 3.0  Convertir des images en batch =======================
# https://stackoverflow.com/questions/56453402/processing-multiple-images-with-magick-in-r-with-transformations

# Exemple
# voir : https://levelup.gitconnected.com/batch-editing-images-with-r-3d4aef08bc62
# library(magick)
# library(tidyverse)
# imglist <- list.files(path=paste0(getwd(), "/input_folder/"))
# images <- map(imglist, ~ image_read_pdf(paste0(getwd(), "/input_folder/", .x))) %>%  
#   map(~ image_scale(.x, "500")) %>%  
#   map(~ image_modulate(.x, saturation = 0))
# output_names <- paste0(1:length(imglist), ".jpg")
# map2(images, output_names, ~ image_write(.x, path=paste0(getwd(), "/output_folder/", .y), format = "jpeg"))

# Suppose d'avoir Ghostscript de la bonne version

imglist <- list.files(path="./03-Output_figures/Test/")
images <- map(imglist, ~ image_read(paste0("./03-Output_figures/Test/", .x)))%>%
  map(~ image_convert(.x,
                   format = "tiff",
                   colorspace = "CMYK",
                   depth=8,
                   matte=TRUE,
                   interlace = "Plane" ))

# map(~ image_set_defines(.x, defines=c("jpeg:profile" ="sRGB")))

output_names <- paste0(1:length(imglist), ".tiff")

map2(images, output_names, ~ image_write(.x, 
                                         path=paste0("./03-Output_figures/Test/", .y), 
                                         format = "tiff",
                                         defines = c("jpeg:profile" ="C:/Program Files/gs/gs9.56.1/iccprofiles/USNewsprintSNAP2007.icc")))

# Le résultat colorimétrique est décevant
# Par contre, la méthode de travail en batch peut être utilisée pour du redimensionnement

# # image_quantize reduces number of unique colors in the image.
# image_quantize(
#   image,
#   max = 256,
#   colorspace = "rgb",
#   dither = TRUE,
#   treedepth = NULL
# )
