Estoy llamando a un script imagemagick a través de node.js y el comando se está rompiendo, pero no puedo entender por qué.

Un ejemplo simplificado de exactamente lo que estoy tratando de hacer:

var spawn = require('child_process').spawn,
    ls    = spawn('convert', ['-size', '168x45', 'xc:transparent', '-draw', '"image over 0,0 0,0 \'/path/to/img1.png\'"', '/path/to/out.png']);

ls.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
});

Si ejecuto ese comando exacto (lo único que cambia son las rutas ya que son absolutas), obtengo, en stderr:

"convert: non-conforming drawing primitive definition `image over 0,0 0,0 '/path/to/img1.png'' @ error/draw.c/DrawImage/3145."

Lo que, según algunos foros, generalmente significa que IM no puede abrir la imagen debido a que tiene una ruta no válida, etc. Ahora lo extraño es que si cambio el convert a echo y anteponer convert obtengo el siguiente comando:

convert -size 168x45 xc:transparent -draw "image over 0,0 0,0 '/path/to/img1.png'" /path/to/out.png

Que funciona perfectamente cuando se ejecuta directamente desde bash.

¿Alguna idea?

Más información:

  • Acabo de probar esto desde el directorio de la imagen y eliminé la ruta (por lo que es image over ... img1.png), y obtengo el mismo error.
  • ejecutar pwd de la misma manera me da el directorio apropiado
4
Mark Kahn 12 ago. 2011 a las 09:13

4 respuestas

La mejor respuesta

Encontró una respuesta: http://shchekoldin.com/2009/10/13/ imagemagick-convert-problem /

Todavía no tengo idea de lo que está sucediendo, pero creando un script de shell con simplemente:

eval 'convert '$@

Y ejecutar eso como el comando (en lugar de convert) resuelve el problema. wtf???

2
Mark Kahn 12 ago. 2011 a las 05:21

De lo que estás hablando, eres el propietario del alojamiento ... así que es más probable que Apache no tenga los privilegios para acceder a /usr/sbin/convert.

Tuve este problema y lo resolví vinculando convert a /usr/local/bin como:

ln /usr/sbin/convert /usr/local/bin

Cambié la ruta en mis scripts y todo funcionó bien. Si eso no funciona y apache aún no tiene acceso al directorio /usr/local/bin, haga una carpeta apache allí y otorgue acceso completo a apache en esa carpeta y enlace convert a esa carpeta.

1
Mihai Iorga 12 ago. 2011 a las 05:19

¿Se está ejecutando node.js como el mismo usuario? Podría ser simplemente que su usuario tiene permisos para el archivo, pero el usuario que ejecuta node.js no.

1
Steve 12 ago. 2011 a las 05:17

Creo (sin probar) que el problema son las comillas dobles en el argumento

'"image over 0,0 0,0 \'/path/to/img1.png\'"'

Lo que está buscando aquí es enviar la cadena completa como un argumento único, en lugar de las cuatro palabras separadas. Sin embargo, ya lo está haciendo al hacer que sea un elemento único en la lista de argumentos de la línea de comandos. Las comillas dobles adicionales en realidad se interpretarían como parte del argumento. Entonces, cambie el argumento a

'image over 0,0 0,0 \'/path/to/img1.png\''

Y no debería necesitar ningún comando eval adicional.

0
Erik Edin 8 dic. 2011 a las 15:03