2011-06-16 6 views
2

Le script bash suivant (.sh) fonctionne correctement sous Unix. Je voudrais convertir en un fichier batch (.bat) pour une utilisation avec ImageMagick pour Windows mais j'ai un peu de mal avec la conversion.Conversion du script Unix ImageMagick en fichier de commandes Windows

repo originale GIT pour le script Unix (s):

https://github.com/AndreyChernyh/imagemagick-filters

Version ImageMagick pour Windows:

http://www.imagemagick.org/download/binaries/ImageMagick-6.7.0-Q16-windows.zip

earlybird.sh:

#!/bin/bash 

SOURCE=$1 

# Prepare 
rm -f result.jpg source_copy.jpg mask.png 
convert $SOURCE -fill rgba\(251,243,213,1.0\) -colorize 100% fill.jpg 
convert assets/earlybird/mask.png -resize `identify -format "%wx%h" $SOURCE`\! mask.png 
cp $SOURCE source_copy.jpg 

# Run 
convert fill.jpg $SOURCE -compose multiply -gravity center -composite - | 
convert - -modulate 101,68,100 - | 
convert - -gamma 1.19 - | 
convert - -channel red +level 10.5%,100% - | 
convert - -modulate 105,120 - | 
convert - -modulate 100,83,100 - | 
convert - -level 0%,92%,0.92 - | 
convert mask.png - -compose ColorBurn -composite - | 
convert mask.png - -compose Multiply -composite result.jpg 

# Cleanup 
rm -f source_copy.jpg fill.jpg 

# Open 
open $SOURCE result.jpg 

C'est ce que j'ai fait jusqu'à présent, mais cela ne fonctionne pas comme prévu car je ne suis pas sûr de l'équivalent en fichiers de commandes de plusieurs arguments de ligne de commande: par exemple, "\" ou "|" ou si c'est même possible. J'ai lu quelque part que l'équivalent est un caret "^" mais encore une fois, je ne suis pas sûr à 100% comment l'implémenter correctement.

@echo off 

set SOURCE=%1 

del result.jpg 
del source_copy.jpg 
del mask.png 

convert.exe %SOURCE% -fill rgba(251,243,213,1.0\) -colorize 100% fill.jpg 
convert.exe assets\earlybird\mask.png -resize 1024x768 mask.png 

copy %SOURCE% source_copy.jpg 

convert.exe fill.jpg %SOURCE% -compose multiply -gravity center -composite -^
convert.exe - -modulate 101,68,100 -^
convert.exe - -gamma 1.19 -^
convert.exe - -channel red +level 10.5%,100% -^
convert.exe - -modulate 105,120 -^
convert.exe - -modulate 100,83,100 -^
convert.exe - -level 0%,92%,0.92 -^
convert.exe mask.png - -compose ColorBurn -composite -^
convert.exe mask.png - -compose Multiply -composite result.jpg 

del source_copy.jpg 
del fill.jpg 

CODE DE TRAVAIL:

Voici ce que je l'ai fait après l'application de la réponse de @Gabe. Pas d'erreurs et ça fonctionne parfaitement!

@echo off 

set SOURCE=%1 

del result.jpg 
del source_copy.jpg 
del mask.png 

conv %SOURCE% -fill rgba(251,243,213,1.0) -colorize 100%% fill.jpg 
conv assets\earlybird\mask.png -resize 604x453 mask.png 

copy %SOURCE% source_copy.jpg 

conv fill.jpg %SOURCE% -compose multiply -gravity center -composite - |^ 
conv - -modulate 101,68,100 - |^ 
conv - -gamma 1.19 - |^ 
conv - -channel red +level 10.5%%,100%% - |^ 
conv - -modulate 105,120 - |^ 
conv - -modulate 100,83,100 - |^ 
conv - -level 0%%,92%%,0.92 - |^ 
conv mask.png - -compose ColorBurn -composite - |^ 
conv mask.png - -compose Multiply -composite result.jpg 

del source_copy.jpg 
del fill.jpg 

Répondre

2

Vous êtes assez proche. Les gros problèmes que je vois sont que vous avez un \ supplémentaire dans rgba(...), vous devez échapper vos signes % (comme %%), et vous devez mettre | avant les caractères de continuation de ligne (comme |^). Essayez ceci:

@echo off 

set SOURCE=%1 

del result.jpg source_copy.jpg mask.png 

convert.exe %SOURCE% -fill rgba(251,243,213,1.0) -colorize 100%% fill.jpg 
convert.exe assets\earlybird\mask.png -resize 1024x768 mask.png 

copy %SOURCE% source_copy.jpg 

convert.exe fill.jpg %SOURCE% -compose multiply -gravity center -composite - |^ 
convert.exe - -modulate 101,68,100 - |^ 
convert.exe - -gamma 1.19 -^
convert.exe - -channel red +level 10.5%%,100%% - |^ 
convert.exe - -modulate 105,120 - |^ 
convert.exe - -modulate 100,83,100 - |^ 
convert.exe - -level 0%%,92%%,0.92 - |^ 
convert.exe mask.png - -compose ColorBurn -composite - |^ 
convert.exe mask.png - -compose Multiply -composite result.jpg 

del source_copy.jpg fill.jpg 
+0

Vous avez travaillé, vous da man! – fuzz

1

Votre script shell unix d'origine est de prendre la sortie de la première conversion cmd et passer d'un appel à l'autre à travers stdout/stdin, comme indiqué par les « - » caractères.

Il est une convention des programmes unix, qu'un argument de '-' signifie "ne cherche pas un nom de fichier à traiter, il suffit de lire depuis l'entrée std." En outre, en parlant de conventions, les programmes DOS utilisent le format '/ o' (option) pour contrôler le programme. Essayez convert.exe /? pour voir si vous obtenez un msg d'utilisation ou aidez ELSE à essayer convert.exe --help (et d'autres variantes unix) juste pour que vous compreniez quelle est la bonne syntaxe d'option à utiliser. Plus important encore, note qu'il existe un programme std DOS.exe appelé convert.exe, alors assurez-vous que votre PATH est configuré pour aller d'abord le ImageMagick pour Windows DIR. Vous serez en mesure de dire quand vous faites le convert.exe /? et vous obtenez des options que vous ne reconnaissez pas.


Le script d'origine utilise le caractère de tuyau pour transmettre stdout d'un programme au stdin du programme suivant. C'est une chaîne impressionnante!

Mon expérience avec cmd shell est vraiment ancienne à ce stade, mais à un moment donné, un tube DOS ne pouvait contenir 64K. Vous rencontrez peut-être ce problème. Si ces commandes sont longues, vous essayez d'exécuter une fenêtre distincte et faites un dir %TEMP pour voir les fichiers de tuyaux en cours de création. Avec autant de canaux, DOS peut avoir un conflit de nommage ou un autre problème. Donc, faites le cas le plus simple, convert .. | convert ... (en faisant juste une partie du travail pour voir si les tuyaux fonctionnent du tout), et construisez à partir de là, en ajoutant 1 de plus | convert .. au fur et à mesure.Si ça explose après un moment, alors vous savez exactement où cela se passe.

Est-ce que la première commande avec (...) dedans fonctionne?

L'évasion ombles \ devrait fonctionner OK, et je vois que vous avez transposé vos caractères de chemin de / à \, de sorte que ce qui est bon.

Et % a une signification spéciale pour les fichiers .bat, pour imprimer des noms de variables comme %f%, de sorte que l'utilisation longue pour % est seulement avec des chiffres que vous pouvez être OK. Pour un var comme% f%, la seule façon que j'ai pu trouver pour casser la traduction était de citer comme %f\%, qui finit par vous donner la sortie non-utile de %f\%.

Pas parfait, mais pas non plus la programmation .bat.

J'espère que cela aide.

+1

@Fulvio: fait avec mes nombreuses modifications. – shellter

+0

@shelter Merci pour les informations détaillées. Cela a énormément aidé. – fuzz

Questions connexes