Dans imagemagick, je peux lire et écrire dans des tubes et spécifier leur format :
cat in.jpg | convert JPG:- -resize 50% PPM:- | jpeg-recompress --ppm -q medium - out.jpg
Dans les outils vips cli, je peux utiliser /dev/stdin ou /dev/stdout, mais il ne semble pas y avoir de moyen d'indiquer le format de fichier, ce qui limite ce que vous pouvez accomplir en utilisant des pipes dans vips.
Ce serait formidable si vips permettait de spécifier/remplacer le chargeur/économiseur pour les images d'entrée et de sortie.
Exemple de syntaxe :
cat in.jpg | vips resize -[load=jpeg] -[save=ppm] 0.5 | jpeg-recompress --ppm -q medium - out.jpg
Cela permettrait également d'enchaîner plusieurs opérations vips cli sans payer les entrées/sorties du disque pour écrire dans des fichiers .v.
Salut Félix, on en a un peu parlé, il y a même une branche expérimentale avec le support des streams :
https://github.com/jcupitt/libvips/tree/load-from-stream
Il peut exécuter ce programme C :
https://gist.github.com/jcupitt/ff21f5b8d1dd6ba54c6f
Il lit une série d'images à partir d'un socket, les traite et les envoie vers un autre socket, le tout sans avoir à charger l'image entière. L'objectif était de prendre en charge les compartiments AWS, mais cela fonctionnerait également pour les canaux de ligne de commande, avec une petite quantité de travail supplémentaire.
Il y a eu une longue conversation à ce sujet:
https://github.com/lovell/sharp/issues/30
J'ai abandonné un peu, puis ça a bitroté, puis j'ai essayé de le nettoyer prêt à fusionner pour maîtriser, et j'ai rencontré quelques problèmes. Il y a encore un peu de travail à faire :/
Je ne parlais pas de diffuser plusieurs images en continu, même si ce serait une fonctionnalité intéressante.
L'idée principale est de pouvoir définir le chargeur ou l'économiseur (ou à peu près le type de fichier), lorsqu'il ne peut pas être déduit de l'extension du fichier. Je suis sûr qu'il y a plus de problèmes pour les types de fichiers qui nécessitent une recherche, mais par exemple. jpeg, png, ppm fonctionnerait bien. Cela serait également utile lorsque plusieurs implémentations peuvent émettre ou charger le même type de fichier. Par exemple, un PDF peut être chargé avec pdfload ou magickload.
Je pense que vous auriez besoin des éléments de streaming pour que /dev/stdin fonctionne. Par exemple, cela échoue :
$ cat k2.jpg | vips jpegload /dev/stdin x.jpg
VipsJpeg: Not a JPEG file: starts with 0x87 0xe5
...
Les chargeurs de fichiers s'attendent à pouvoir ouvrir leur entrée plusieurs fois. Le truc du streaming ajouterait un tampon de lecture qui rendrait cela possible - les nombreuses images d'un flux ne sont qu'un bonus.
Ceci est ajouté en 8.9. Vous pouvez écrire par ex.
aws s3 cp s3://mybucket/input.jpg - | \
vips thumbnail_source [descriptor=0] .jpg 128 | \
aws s3 cp - s3://mybucket/output.jpg
Les notes de version contiennent plus d'informations :
https://libvips.github.io/libvips/2019/12/11/What's-new-in-8.9.html
Commentaire le plus utile
Ceci est ajouté en 8.9. Vous pouvez écrire par ex.
Les notes de version contiennent plus d'informations :
https://libvips.github.io/libvips/2019/12/11/What's-new-in-8.9.html