Discussione:
ImageMagick Errore con Parentesi
Aggiungi Risposta
Nemo
2021-09-26 08:41:42 UTC
Rispondi
Permalink
Ciao a Tutti,

per caricare foto sul web, utilizzo con soddisfazione il comando
*Convert*, per ridurre di peso e dimensione le foto, anche in modalità
bulk, cioè tante foto in un colpo solo.

Ora, mi si è presentata la necessità di caricare diverse foto con angoli
arrotondati con l’ombra. In questo modo le foto non sono piatte, ma
sollevate dallo sfondo con un aspetto tridimensionale.

Dopo aver cercato molto in internet, ho trovato questo script interessante:

#================================================================
#!/bin/bash

# Backdrop
convert input.png -bordercolor white -border 10 result.png

# Border
convert result.png -bordercolor white -border 4 output.png

# Shadow
convert output.png ( +clone -background black -shadow 40x5+0+0 ) +swap
-background none -layers merge +repage test.png;

# Rounded Corners
convert output.png
( +clone -alpha extract
-draw 'fill black polygon 0,0 0,5 5,0 fill white circle 5,5 5,0'
( +clone -flip ) -compose Multiply -composite
( +clone -flop ) -compose Multiply -composite
) -alpha off -compose CopyOpacity -composite image.png


#================================================================

Tuttavia, se eseguo i comandi separatamente, *Backdrop* e *Border*
funzionano bene, mentre il comando Shadow, mostra il seguente errore:
bash: errore di sintassi vicino al token non atteso "("

Per quanto riguarda il comando Rounded Corners, se lo scrivo tutto su
una sola riga, anche lui mostra lo stesso errore: bash: errore di
sintassi vicino al token non atteso "("

Potrei risolvere, questo problema, con i fogli di stile, lato server,
ma, per ogni variazione, dovrei inserire delle nuove classi diverse nel
file.css; invece mi piacerebbe riuscire a gestire il tutto in locale,
sul mio computer con ImageMagick.

Grazie in anticipo, per qualunque risposta (positiva),
Nemo

PS: Utilizzo: Ubuntu Mate 20.04 LTS con ImageMagick 6.9.10-23 Q16 x86_64
20190101
Piergiorgio Sartor
2021-09-26 09:14:55 UTC
Rispondi
Permalink
Post by Nemo
Ciao a Tutti,
per caricare foto sul web, utilizzo con soddisfazione il comando
*Convert*, per ridurre di peso e dimensione le foto, anche in modalità
bulk, cioè tante foto in un colpo solo.
Ora, mi si è presentata la necessità di caricare diverse foto con angoli
arrotondati con l’ombra. In questo modo le foto non sono piatte, ma
sollevate dallo sfondo con un aspetto tridimensionale.
#================================================================
#!/bin/bash
# Backdrop
convert input.png -bordercolor white -border 10 result.png
# Border
convert result.png -bordercolor white -border 4 output.png
# Shadow
convert output.png ( +clone -background black -shadow 40x5+0+0 ) +swap
-background none -layers merge +repage test.png;
# Rounded Corners
convert output.png
( +clone -alpha extract
-draw 'fill black polygon 0,0 0,5 5,0 fill white circle 5,5 5,0'
( +clone -flip ) -compose Multiply -composite
( +clone -flop ) -compose Multiply -composite
) -alpha off -compose CopyOpacity -composite image.png
#================================================================
Tuttavia, se eseguo i comandi separatamente, *Backdrop* e *Border*
bash: errore di sintassi vicino al token non atteso "("
Per quanto riguarda il comando Rounded Corners, se lo scrivo tutto su
una sola riga, anche lui mostra lo stesso errore: bash: errore di
sintassi vicino al token non atteso "("
Potrei risolvere, questo problema, con i fogli di stile, lato server,
ma, per ogni variazione, dovrei inserire delle nuove classi diverse nel
file.css; invece mi piacerebbe riuscire a gestire il tutto in locale,
sul mio computer con ImageMagick.
Grazie in anticipo, per qualunque risposta (positiva),
Nemo
PS: Utilizzo: Ubuntu Mate 20.04 LTS con ImageMagick 6.9.10-23 Q16 x86_64
20190101
Un paio di cose...

La prima, come fa bash a sapere che il
comando continua sulla riga successiva?

Se si scrive:

convert
pippo.gif
pippo.png

Cosa succede?
A differenza di "convert pippo.gif pippo.png"...

Secondo, le parentesi sono interpretate da "bash".
Bisogna proteggerle con "\", tipo "\(" invece di "(".

Forse c'e` altro...

bye,
--
piergiorgio
Tony Borlini
2021-09-26 12:27:11 UTC
Rispondi
Permalink
Post by Nemo
per caricare foto sul web, utilizzo con soddisfazione il comando
*Convert*, per ridurre di peso e dimensione le foto, anche in modalità
bulk, cioè tante foto in un colpo solo.
Ora, mi si è presentata la necessità di caricare diverse foto con angoli
arrotondati con l’ombra. In questo modo le foto non sono piatte, ma
sollevate dallo sfondo con un aspetto tridimensionale.
[cut]
Post by Nemo
Potrei risolvere, questo problema, con i fogli di stile, lato server,
ma, per ogni variazione, dovrei inserire delle nuove classi diverse nel
file.css; invece mi piacerebbe riuscire a gestire il tutto in locale,
sul mio computer con ImageMagick.
Per me è più che ovvio, forse è pure scontato scriverlo, che se tu hai
deciso di usare imagemagick per manipolare in locale le immagini che
andrai poi a pubblicare sul web, quella è una tua scelta personale e non
c'è altro da aggiungere, cioè 'contento te contenti tutti', però a mio
parere non ha alcun senso la motivazione generale che hai addotto per
preferire imagemagick all'uso dei fogli di stile in quanto a tuo parere
quest'ultimi per ogni variazione ti obbligherebbero ad inserire delle
nuove classi.

In realtà volendo successivamente modificare qualcosa, in termini di
riduzione delle operazioni e del tempo occupato è proprio l'esatto
contrario: utilizzando un foglio di stile per ogni variazione comune a
tutte le tue foto dovresti modificare o aggiungere una sola volta
l'istruzione nel css, mentre per ottenere la stessa modifica uniforme a
tutte le foto tramite imagemagick dovresti nuovamente aprirle e
ritoccarle ad una ad una.

Non sarebbe molto diverso anche se volessi apporre una modifica ad una
sola foto: ti basterebbe per quella specifica foto, inserire nel TAG
<img> un id e poi nel css aggiungere quello stesso id con le istruzioni
desiderate.
L'id di quell'immagine avrà il sopravvento sulla classe di appartenenza.
Se ad esempio le tue immagini appartengono tutte ad una classe che
indica loro che il bordo deve essere di colore nero e poi un giorno
decidi che una di quelle immagini la vuoi col bordo di colore rosso, non
avresti che da aggiungere a quella immagine un id dove indichi che vuoi
appunto il bordo rosso, ed automaticamente quell'immagine verrà
visualizza con il bordo di quel colore pur appartenendo ad una classe
che a livello generale di suo impone il bordo nero.

Visto che scrivi di voler ottenere un effetto tridimensionale sulle
immagini aggiungendo un'ombra per sollevarle dallo sfondo, magari un
giorno vorresti poter anche aggiungere degli effetti "dinamici", ad
esempio dare l'impressione, tramite la riduzione dell'ampiezza
dell'ombra, che quando clicchi su una foto questa subisca una pressione
e quindi si avvicini allo sfondo.
Per fare ciò ti basterebbero poche istruzioni in javascript che rilevino
l'evento click del mouse sull'immagine e vadano a modificare al volo le
dimensioni dell'ombra così come sono espresse nella sua classe nel css.

In questo caso senza voler usare un foglio di stile saresti invece
costretto a duplicare ad una ad una tutte le immagini creando con
imagemagick delle immagini identiche ma con un'ombra ridotta, e poi una
volta caricate quest'ultime sul server, istruire javascript perché al
click del mouse su di una foto, venga caricata la sua corrispondente con
l'ombra ridotta. Certo si può fare anche così ma è evidente da ogni
punto di vista quanto sia più dispendioso.
Nemo
2021-09-26 17:19:56 UTC
Rispondi
Permalink
Post by Tony Borlini
[...]
In questo caso senza voler usare un foglio di stile saresti invece
costretto a duplicare ad una ad una tutte le immagini creando con
imagemagick delle immagini identiche ma con un'ombra ridotta, e poi una
volta caricate quest'ultime sul server, istruire javascript perché al
click del mouse su di una foto, venga caricata la sua corrispondente con
l'ombra ridotta. Certo si può fare anche così ma è evidente da ogni
punto di vista quanto sia più dispendioso.
Ciao a Tutti,
grazie per le vostre solerti risposte !!!

@Piergiorgio Sartor

La tua risposta parziale, mi ha stimolato a cercare ancora in internet e
a capire come funziona il return-carriage in bash e analizzando uno
script che funziona ho imparato che alla fine di una riga serve il \
backslash, inoltre davanti alle parentesi rotonde \( xxxxxxx \).

[...]
mkdir roundcorners
for f in *.jpg
do convert $f -resize 1024 \
\( +clone -alpha extract \
-draw 'fill black polygon 0,0 0,45 45,0 fill white circle 45,45
45,0' \
\( +clone -flip \) -compose Multiply -composite \
\( +clone -flop \) -compose Multiply -composite \
\) -alpha off -compose CopyOpacity -composite -unsharp 10x4+1+0
roundcorners/$f.png
[…]

*Consiglio di vedere lo script finale di questo forum, è stupefacente!*

https://legacy.imagemagick.org/discourse-server/viewtopic.php?t=30321


@Tony Borlini

Grazie per il tuo chiarimento! Mi studierò con impegno e passione
l’inserimento di un ID in una Classe. La tua spiegazione mi incuriosisce
molto.


Comunque, preferisco sempre avere un Piano B. Male che vada, lo script
può essere utilizzato nella grafica tipografica, per costruire poster e
locandine. Se si ha la necessità di elaborare molte foto, utilizzare
Gimp o Inkscape diventa un po' noioso e dispendioso di tempo.

Grazie e buona serata!
Nemo

Geronimo Bosco
2021-09-26 17:00:48 UTC
Rispondi
Permalink
Post by Nemo
per caricare foto sul web, utilizzo con soddisfazione il comando
*Convert*, per ridurre di peso e dimensione le foto, anche in modalità
bulk, cioè tante foto in un colpo solo.
Tuttavia, se eseguo i comandi separatamente, *Backdrop* e *Border*
bash: errore di sintassi vicino al token non atteso "("
come dice Piergiorgio con backslash davanti alle parentesi funziona.
Continua a leggere su narkive:
Loading...