Journal Mini shell script pour optimiser des images pour une liseuse

Posté par  .
15
9
nov.
2012

Bonjour,
J'ai récemment fait l'acquisition d'une liseuse Kobo Touch, et j'en ai profité pour écrire un petit script basé sur ImageMagick et 7zip. Ce script permet d'optimiser des archives de type Comic_Book_Archive_file pour cette liseuse.
Je le poste en espérant qu'il sera utile, et il devrait être adaptable assez facilement pour d'autres liseuses :

#!/bin/sh

TOLERANCE=4%
JPG_QUALITY=75
SIZE=600x800
TMP_DIR=/tmp/koboTest
INPUT_COMIC_TYPE=.cbr

rm -rf $TMP_DIR
mkdir $TMP_DIR
7z e "$1" -o$TMP_DIR

for i in $TMP_DIR/*
do
    convert "$i" -fuzz $TOLERANCE -quality $JPG_QUALITY -resize $SIZE -trim +repage -colorspace gray "$i"
done

7z a -tzip -w$TMP_DIR "`basename "$1" $INPUT_COMIC_TYPE`"-kobo.cbz $TMP_DIR/*
rm -rf $TMP_DIR

  • # Support sous Linux ?

    Posté par  (site web personnel) . Évalué à 6.

    J'ai récemment fait l'acquisition d'une liseuse Kobo Touch (…)

    Qu'est-ce que cela donne en ce qui concerne le support sous Linux ? La liseuse est reconnue en tant que périphérique USB ou c'est moins évident que cela ?

    • [^] # Re: Support sous Linux ?

      Posté par  . Évalué à 6.

      Ca fonctionne plutôt bien. La liseuse est vue comme un périphérique USB Mass storage, et il suffit de copier les ebooks dessus comme on le ferait sur une clef USB.
      Après pour les conversions de format (mobipocket vers epub) j'utilise Calibre
      Il me reste à tester le port micro SD de la liseuse. Je pense que la carte sera vue comme une deuxième partition mass storage, à confirmer.

    • [^] # Re: Support sous Linux ?

      Posté par  (site web personnel) . Évalué à 7.

      La liseuse est reconnue en tant que périphérique USB ou c'est moins évident que cela ?

      C'est aussi simple que ça, puisque ce n'est pas du matériel Apple.

    • [^] # Re: Support sous Linux ?

      Posté par  . Évalué à 2.

      Le Kobo tourne entièrement sous Linux et apparait comme un disque USB classique.

      Le seul problème est que le KT est doit être activée en utilisant une application propriétaire qui n'existe pas sous Linux. Il reste utilisable sans être 'activé' mais sans le Wifi et les mises à jours automatiques.

      Il existe toutefois des techniques pour effectuer une fausse 'activation'

      Voir par exemple le message #4 dans
      http://www.mobileread.mobi/forums/showthread.php?t=171664

      De façon générale, le Kobo Touch est très facile à hacker!

      Voir "hacking kobo touch" sur google pour plus de détails.

      • [^] # Re: Support sous Linux ?

        Posté par  . Évalué à 1.

        Si on dérive sur ce sujet…

        Je tiens à préciser que les Onyx Boox sont presques irréprochables, utilisation de linux pour l'OS, pas de store, pas d'activation, tout est visible en stockage de masse.

        Le seul point noir, c'est la possibilité de lire des DRM, mais voir ça comme un défaut est discutable.

        Pour être précis, j'utilise l'Onyx Boox X61E.

      • [^] # Re: Support sous Linux ?

        Posté par  (site web personnel) . Évalué à 1.

        Par contre je crois qu'on ne peut pas faire d'achat, je m'étais retrouvé à tester le logiciel dédié sous une machine virtuelle.
        Toujours un peu rageant!

      • [^] # Re: Support sous Linux ?

        Posté par  . Évalué à 1.

        Maintenant on peut activer par Wi-fi, plus besoin de faire des truc bizarre ou de windows

        • [^] # Re: Support sous Linux ?

          Posté par  (site web personnel) . Évalué à 8. Dernière modification le 09 novembre 2012 à 17:44.

          Le simple fait de devoir activer est déjà un scandale. Je n'ai pas à activer mes livres en papier. Ni ma liseuse électronique, j'en ai acheté une respectueuse.

  • # Optimiser pour quoi ?

    Posté par  . Évalué à 8.

    Tu essaie de gagner au niveau de l'occupation disque (enfin carte SD) ou la liseuse a du mal avec les archives trop lourdes en mémoire ? Ça me semble dommage de ne plus pouvoir zoomer sur un texte un peu petit.

    Les Kobo m'intéressent justement pour leur support des comics mais je n'ai pas trouvé beaucoup d'avis sur cette utilisation en particulier.

    Sinon,

    TMP_DIR=`mktemp -d`
    
    

    c'est pas mal et ça évite le premier rm. Merci pour le script en tout cas.

    • [^] # Re: Optimiser pour quoi ?

      Posté par  . Évalué à 3.

      Non je n'essayais pas particulièrement de gagner de la place, plutôt de redimensionner l'image en supprimant les marges. Je suis en train de potasser la documentation d'ImageMagick pour voir si je ne peux pas améliorer le contraste au passage.
      Je n'ai pas eu de problème de taille avec des archives, mais celle que j'ai ne sont pas très grosses (une quarantaine de Mo maximum).
      Merci pour le mktemp, je ne connaissais pas.

      • [^] # Re: Optimiser pour quoi ?

        Posté par  (site web personnel) . Évalué à 7.

        Regarde aussi le manuel de tempfile, qui, s'il ne conviendra probablement pas à ton cas précis, donne une astuce pour que les fichiers temporaires soient retirés même si l'utilisateur arrête ton script :

        trap "rm -f -- '$t'" EXIT
        
        
      • [^] # Re: Optimiser pour quoi ?

        Posté par  . Évalué à 2.

        J'ai également un Kobo Touch. J'avais fait quelques essais mais je ne suis pas convaincu que l'ecran E-paper se prête bien à l'affichage d'images. Il n'y a que 16 niveaux de gris. C'est très suffisant pour le texte mais pas pour les images.

        Pour le contraste il y a l'option -contrast. Elle n'a pas d'argument mais elle peut être répétée plusieurs fois pour augmenter l'effet.

        convert asticot.jpg -colorspace gray -contrast -contrast -contrast -contrast -contrast -contrast -contrast -contrast -contrast jpg:- | display jpg:-

        Tu devrais aussi regarder du coté de l'option -gamma car le E-paper est assez différent d'un écran classique.

        convert asticot.jpg -gamma 1.5 jpg:- | display jpg:-

        Ajuster les 'black-points' et 'white-points' avec -level pourrait aussi être utile pour se focaliser sur les niveaux de gris moyens.

        convert asticot.jpg -level 20%,90% jpg:- | display jpg:-

        Par contre, il faut éviter -color 16 car le KT fait sa propre conversion en 16 niveaux de gris et le résultat final risque d'avoir moins de 16 niveaux.

        • [^] # Re: Optimiser pour quoi ?

          Posté par  (site web personnel) . Évalué à 3.

          Personnellement, sur ma Bookeen Cybook Orizon qui a aussi 16 niveaux de gris, l'affichage des images est satisfaisant, de façon assez étonnante d'ailleurs : on peut remarquer des effets d'escalier, mais à condition de les chercher !

    • [^] # Re: Optimiser pour quoi ?

      Posté par  (site web personnel) . Évalué à 7.

      La syntaxe à apostrophes inverses est caduque, il faut utiliser $() qui est plus pratique.

  • # mogrify

    Posté par  (site web personnel) . Évalué à 5.

    Pour modifier une image sur place, ImageMagick fournit la commande mogrify.

  • # img2epub

    Posté par  . Évalué à 3.

    Bonjour,

    Pour résoudre un problème similaire (convertir des images de mangas pour lire sur une liseuse), j'ai utilisé ça: img2epub. C'est du python, et ça crée directement des fichiers .epub à partir d'un répertoire d'image.

    Ça permet en plus de rogner les marges, couper les pages en 2, …

    Par contre, sur ma liseuse (Bookeen Cybook Orizon), ma collection de mangas (42 titres) rend le démarrage de l'appareil extrêmement long (environ 10 minutes!) Je suppose que la liseuse scanne tous les epub contenu dans la mémoire pour créer son index, mais c'est vraiment trop long!!

    A+

    • [^] # Re: img2epub

      Posté par  . Évalué à 1.

      Le kobo est un peu plus malin : il rafraîchit l'index à la déconnexion usb (mais ça peut aussi être krèkrè long). Par contre, quand les titres sont sur la carte SD, je ne sais pas comment il se comporte (il serait logique qu'il fasse comme la tienne).

      • [^] # Re: img2epub

        Posté par  (site web personnel) . Évalué à 4.

        C'est en fait un bug connu du Cybook Orizon, il est censé générer des fichiers de miniatures pour les nouveaux fichiers ou pour les fichiers mis à jour, et utiliser les miniatures existantes quand elles sont à jour. Sauf qu'en fait non : il met à jour les miniatures à chaque fois.

        • [^] # Re: img2epub

          Posté par  . Évalué à 2.

          Sauf qu'en fait non : il met à jour les miniatures à chaque fois.

          En fait il y a 2 problèmes de lenteur que j'ai constaté sur le Bookeen Cybook Orizon:
          - Démarrage hyper long quand on a plusieurs dizaines de livres stockés;
          - L'ouverture de la "bibliothèque" génère les miniatures une à une, et c'est très lent: environ 3-4 secondes par miniature, et quand on a 20 titres par page, et que l'on ne peut rien faire en attendant, c'est rageant!

          Outre ces problèmes de lenteur, j'ai aussi constaté que la batterie se vide toute seule (Cybook en veille) et que lorsqu'on lit, pas moyen d'avoir l'état de la batterie…

          Conclusion, lorsque j'ai le temps de lire, une fois sur deux ma liseuse est déchargée et met 10 minutes à s'allumer. Ensuite le temps de retrouver le livre dans la bibliothèque puis la page qui a été perdue à cause de la perte d'alimentation, j'ai plus vite fait d'aller chercher un livre papier et de lire quelques chapitres, plus détendu!

          A+

    • [^] # Re: img2epub

      Posté par  . Évalué à 1.

      Sympa, je vais tester ça fonctionnera peut être mieux que mon script.
      Par contre est ce qu'il y a un intérêt particulier à passer au format epub pour des images, sachant que le kobo gère directement le format cbr/cbz ?

  • # Amusant !

    Posté par  . Évalué à 3.

    J'ai fait exactement la même chose pour ma liseuse sony.

    Excepté que j'utilisais mogrify qui modifie à la volée plutôt que convert.

    Sauf que… Je me suis rendu compte après quelques essais qu'il valait mieux laisser calibre faire la conversion des images en lui donnant le bon profil lors de la génération de l'epub.

    Les images converties depuis la couleur étaient toujours top sombres pour être bien lues.

    Je copierais bien mon script là mais… Évidemment la carte-mère de la machine sur laquelle je l'ai m'a lâché hier :p

    Dès que j'ai une nouvelle CM, je partage !

    cd /pub && more beer

    • [^] # Re: Amusant !

      Posté par  . Évalué à 4.

      Et donc, je me réponds, et je vais avoir droit à la geekscotte :p

      C'est sale, c'est pas fini, mais ça fait le taff :p

      #!/bin/sh
      
      ##### manga_to_epub.sh
      
      # Ce script convertit un répertoire contenant des images d'un scantrad de
      # manga en epub utilisable sur un reader Sony TRS-P2
      # Il prend en argument le chemin vers le répertoire contenant le "chapitre"
      # qui devra être traité.
      
      # Le chemin devra se présenter sous la forme : /bla/bla/nom_de_la_série/
      # où se trouve un répertoire par chapitre
      
      ################################################################################
      # Vérification des arguments donnés au script                                  #
      ################################################################################
      
      # Test de la présence de l'argument chemin
      
      if [[ X$1 = X ]]
              then
                      echo "Chemin vers le chapitre manquant" && exit 1
              else CHEMIN=$1
      fi
      
      # Test de la presence du chemin
      
      if [[ ! -d "${CHEMIN}" ]]
              then
                      echo "Chemin inexistant" && exit 1
      fi
      
      ################################################################################
      # Déclaration des fonctions                                                    #
      ################################################################################
      
      # Test de la présence de zip
      f_test_zip ()
      {
      which zip > /dev/null 2>&1
      if [[ $? != 0 ]]
              then
                      echo "L'utilitaire zip est introuvable. Merci de l'installer" && exit 1
              else
                      ZIP="zip -9 -r -q"
      fi
      }
      
      # Test de la présence de ebook-convert
      f_test_ebookconvert ()
      {
      which ebook-convert > /dev/null 2>&1
      if [[ $? != 0 ]]
              then
                      echo "L'utilitaire ebook-convert est introuvable. Merci d'installer calibre" && exit 1
      fi
      }
      
      # Récupération des métadonnées
      # Le sed goret au milieu permet de transformer les ' en ’ pour ne pas exploser la ligne de commande générée pour ebook-convert
      f_metadatas ()
      {
      if [[ -f "${CHEMIN}"/.chapt_meta ]]
              then
                      echo "Informations sur le volume déjà présentes"
              else
                      echo "Nom des auteurs"
                      read AUTEURS
                      echo "Nom de l'album"
                      read ALBUM
                      echo "Nom de la série"
                      read SERIE
                      echo "AUTEURS="${AUTEURS}"" >> "${CHEMIN}"/.chapt_meta
                      echo "ALBUM="${ALBUM}"" >> "${CHEMIN}"/.chapt_meta
                      echo "SERIE="${SERIE}"" >> "${CHEMIN}"/.chapt_meta
                      sed -i -e 's/\x27/’/g' "${CHEMIN}"/.chapt_meta
      fi
      }
      # Génération du fichier de traitement des chapitres.
      f_chapitres ()
      {
      echo "Génération de la liste des chapitres à traiter"
      cd "${CHEMIN}"
      touch .chapt_old
      find . -type d  | sed -e '1d' -e 's/\.\///g' | sort > .chapt_all
      diff -n .chapt_old .chapt_all | sed -e'1d' > .chapt_new
      if [ ! -s .chapt_new ](http://fr.wikipedia.org/wiki/ ! -s .chapt_new  "Définition Wikipédia")
              then echo "Pas de nouveaux chapitres à traiter" && exit 0
      fi
      }
      
      # Compression des répertoires de chapitres
      f_compress ()
      {
      echo "Compression du chapitre ${chapter}"
      ${ZIP} "${chapter}".cbz "${chapter}";
      if [[ $? != 0 ]]
              then echo "Problème dans la compression du répertoire" && exit 1
      fi
      echo "${chapter}".cbz:"${chapter}" >> comics.txt
      }
      
      # Création du .cbc
      f_collection ()
      {
      echo "Création de l'archive"
      ${ZIP} `basename "${CHEMIN}"`.cbc comics.txt *.cbz
      if [[ $? != 0 ]]
              then echo "Problème dans la création de l'archive" && exit 1
      fi
      }
      
      # Création de l'ebook à partir des fichiers générés et des métadonnées
      f_epubification ()
      {
      echo "Création de l'ebook. Veuillez patienter"
      auteurs=`grep AUTEURS .chapt_meta | cut -d"=" -f2`
      album=`grep ALBUM .chapt_meta | cut -d"=" -f2`
      serie=`grep SERIE .chapt_meta | cut -d"=" -f2`
      ebook-convert `basename "${CHEMIN}"`.cbc `basename "${CHEMIN}"`.epub --output-profile sony --keep-aspect-ratio --right2left --dont-grayscale --no-process --no-sort --no-default-epub-cover --authors \""${auteurs}"\" --series \""${serie}"\" --title \""${album}"\" > /dev/null 2>&1;
      if [[ $? != 0 ]]
              then echo "Problème dans la génération de l'epub" && exit 1
      fi
      }
      
      # Nettoyage des chapitres
      f_nettoyage ()
      {
      echo "Nettoyage des fichiers temporaires"
      rm -f *.cbz *.cbc comics.txt
      }
      
      ################################################################################
      # Test de présence des outils nécessaires                                      #
      ################################################################################
      
      # Test de la présence de zip
      f_test_zip
      
      # Test de la présence de ebook-convert
      f_test_ebookconvert
      
      ################################################################################
      # Traitements sur les fichiers                                                 #
      ################################################################################
      
      echo "Début de la création de l'ebook"
      
      f_metadatas
      f_chapitres
      
      while read chapter
              do
              f_compress
      done < .chapt_new
      
      f_collection
      f_epubification
      f_nettoyage
      
      mv .chapt_all .chapt_old
      
      echo "Votre ebook est créé"
      
      

      cd /pub && more beer

  • # Bien vu

    Posté par  . Évalué à 2.

    La dernière fois que j'ai voulu me faire un ebook d'images, j'ai bourriné avec un :
    convert *.jpg lol.pdf

    Mais je garderais bien ce script sous le bras pour le coup.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.