⚠️ Este es un sitio de traducción no oficial, sin relación con ImageMagick Studio LLC. Para información autorizada, consulte la página original (https://imagemagick.org/porting/).

ImageMagick versión 7 • Imágenes de alto rango dinámico • Canales de píxel • Alfa • Escala de grises • Máscaras • API MagickCore • Archivos de cabecera • Funciones obsoletas eliminadas • Interfaz de línea de comandos • Mejoras de rendimiento • Resumen de cambios de la versión 7

El diseño de ImageMagick es un proceso evolutivo, en el que los esfuerzos de diseño e implementación se influyen y guían mutuamente hacia un mayor progreso. Con ImageMagick versión 7, mejoramos el diseño a partir de las lecciones aprendidas con la implementación de la versión 6. ImageMagick fue diseñado originalmente para mostrar imágenes RGB en un servidor X Windows. Con el tiempo extendimos el soporte a imágenes RGBA y luego al formato de imagen CMYK y CMYKA. Con ImageMagick versión 7, extendemos el soporte a espacios de color arbitrarios con un número arbitrario de canales de píxel. Además, ImageMagick 7 almacena los canales de píxel como números de coma flotante, lo que permite valores fuera de banda (por ejemplo, negativos) y reduce el error de redondeo. Hay muchas otras mejoras de diseño descritas en este documento.

Para admitir canales de píxel variables en la API MagickCore, el manejo de píxeles ha cambiado al obtener o establecer los canales de píxel. Puede acceder a los canales como un array, pixel[i], o usar un método de acceso como GetPixelRed() o SetPixelRed(). Hay cambios modestos en las API de MagickCore y MagickWand. Las API de Magick++ y PerlMagick no han cambiado y coinciden con las de ImageMagick versión 6.

La API de shell (línea de comandos) de ImageMagick versión 7 ha experimentado una revisión importante, con énfasis específico en la capacidad de leer «opciones» no solo desde la línea de comandos, sino también desde scripts y flujos de archivos. Esto permite el uso de técnicas de programación de «coprocesamiento» o el procesamiento de imágenes mediante «backends de demonio/servidor», e incluso el procesamiento distribuido en varias máquinas.

Con la revisión de la API de shell se realizaron otras mejoras, entre ellas: mejor informe de qué opción falló, la consolidación y obsolescencia de opciones, y un uso más global de las «propiedades de imagen» (más comúnmente conocidas como «escapes de porcentaje») en los argumentos de las opciones.

ImageMagick versión 7 está disponible ahora como una versión de producción.

Ahora que ImageMagick versión 7 ha sido lanzado, seguimos dando soporte a la versión 6 durante un mínimo de 10 años. El soporte de la versión 6 se limita principalmente a correcciones de errores y parches de seguridad, con pocas mejoras.

Imágenes de alto rango dinámico

ImageMagick versión 7 habilita por defecto las imágenes de alto rango dinámico (HDRI). HDRI representa con precisión el amplio rango de niveles de intensidad presentes en escenas reales, desde la luz solar directa más brillante hasta las sombras más profundas y oscuras. Además, los resultados del procesamiento de imágenes son más precisos. La desventaja es que requiere más memoria y puede dar lugar a tiempos de procesamiento más lentos. Si observa diferencias entre los resultados de su línea de comandos de la versión 6 y la versión 7, es probable que se deba a HDRI. Quizá necesite añadir -clamp a su línea de comandos para restringir los píxeles al rango de 0 a QuantumRange, o deshabilitar HDRI al compilar ImageMagick versión 7. Para deshabilitar HDRI (recomendado para compilaciones de teléfonos inteligentes como iOS o sitios de producción donde el rendimiento es prioritario), simplemente añada --disable-hdri a la línea de comandos del script configure al compilar ImageMagick.

Canales de píxel

Un píxel está compuesto por uno o más valores de color, o canales (por ejemplo, el canal de píxel rojo).

Las versiones anteriores de ImageMagick (4-6) admiten de 4 a 5 canales de píxel (RGBA o CMYKA). Los primeros 4 canales se acceden con la estructura de datos PixelPacket. La estructura incluye 4 miembros de tipo Quantum (típicamente de 16 bits) de rojo, verde, azul y opacidad. El canal negro o los índices del mapa de colores se admiten mediante un método y estructura separados, IndexPacket. Como ejemplo, aquí hay un fragmento de código de ImageMagick versión 6 que niega los componentes de color (pero no el componente alfa) de los píxeles de la imagen:

for (y=0; y < (ssize_t) image->rows; y++)
{
  IndexPacket
    *indexes;

  PixelPacket
    *q;

  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
  if (q == (PixelPacket *) NULL)
    {
      status=MagickFalse;
      continue;
    }
  indexes=GetCacheViewAuthenticIndexQueue(image_view);
  for (x=0; x < (ssize_t) image->columns; x++)
  {
    if ((channel & RedChannel) != 0)
      q->red=(Quantum) QuantumRange-q->red;
    if ((channel & GreenChannel) != 0)
      q->green=(Quantum) QuantumRange-q->green;
    if ((channel & BlueChannel) != 0)
      q->blue=(Quantum) QuantumRange-q->blue;
    if (((channel & IndexChannel) != 0) &&
        (image->colorspace == CMYKColorspace))
      indexes[x]=(IndexPacket) QuantumRange-indexes[x];
    q++;
  }
  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    status=MagickFalse;
}

ImageMagick versión 7 admite cualquier número de canales de 1 a 64 (y más allá) y simplifica el acceso con un único método que devuelve un array de canales de píxel de tipo Quantum. El código fuente que se compila con versiones anteriores de ImageMagick requiere refactorización para funcionar con ImageMagick versión 7. Lo ilustramos con un ejemplo. Refactoricemos ingenuamente el fragmento de código de la versión 6 anterior para que funcione con la API de ImageMagick versión 7:

for (y=0; y < (ssize_t) image->rows; y++)
{
  Quantum
    *q;

  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
  if (q == (Quantum *) NULL)
    {
      status=MagickFalse;
      continue;
    }
  for (x=0; x < (ssize_t) image->columns; x++)
  {
    if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
      SetPixelRed(image,QuantumRange-GetPixelRed(image,q),q);
    if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
      SetPixelGreen(image,QuantumRange-GetPixelGreen(image,q),q);
    if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
      SetPixelBlue(image,QuantumRange-GetPixelBlue(image,q),q);
    if ((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0)
      SetPixelBlack(image,QuantumRange-GetPixelBlack(image,q),q);
    if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
      SetPixelAlpha(image,QuantumRange-GetPixelAlpha(image,q),q);
    q+=GetPixelChannels(image);
  }
  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    status=MagickFalse;
}

Hagámoslo de nuevo, pero aprovechando al máximo el nuevo soporte de canales de píxel variables:

for (y=0; y < (ssize_t) image->rows; y++)
{
  Quantum
    *q;

  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
  if (q == (Quantum *) NULL)
    {
      status=MagickFalse;
      continue;
    }
  for (x = 0; x < (ssize_t) image->columns; x++)
  {
    ssize_t
      i;

    if (GetPixelWriteMask(image,q) <= (QuantumRange/2))
      {
        q+=GetPixelChannels(image);
        continue;
      }
    for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
    {
      PixelChannel channel = GetPixelChannelChannel(image,i);
      PixelTrait traits = GetPixelChannelTraits(image,channel);
      if ((traits & UpdatePixelTrait) == 0)
        continue;
      q[i]=QuantumRange-q[i];
    }
    q+=GetPixelChannels(image);
  }
  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    status=MagickFalse;
}

Observe cómo usamos GetPixelChannels() para avanzar al siguiente conjunto de canales de píxel.

Los índices del mapa de colores y el canal de píxel negro (para el espacio de color CMYK) ya no se almacenan en el canal de índice, antes accedido con GetAuthenticIndexQueue() y GetCacheViewAuthenticIndexQueue(). En su lugar, ahora son canales de píxel de primera clase y se acceden como miembro del array de píxeles (por ejemplo, pixel[4]) o con los métodos de acceso de píxel de conveniencia GetPixelIndex(), SetPixelIndex(), GetPixelBlack() y SetPixelBlack().

Como consecuencia de usar una estructura de array para canales de píxel variables, los compiladores con autovectorización tienen oportunidades adicionales para acelerar los bucles de píxeles.

El canal sync en IMv6 era realmente una bandera en lugar de un canal. En IMv7, en su lugar usamos una bandera: -define compose:sync=false.

Métodos de acceso de píxel

Puede acceder al canal de píxel como elementos de array (por ejemplo, pixel[1]) o usar métodos de acceso de conveniencia para obtener o establecer los canales de píxel:

GetPixela()                  SetPixela()
GetPixelAlpha()              SetPixelAlpha()
GetPixelb()                  SetPixelb()
GetPixelBlack()              SetPixelBlack()
GetPixelBlue()               SetPixelBlue()
GetPixelCb()                 SetPixelCb()
GetPixelCr()                 SetPixelCr()
GetPixelCyan()               SetPixelCyan()
GetPixelGray()               SetPixelGray()
GetPixelGreen()              SetPixelGreen()
GetPixelIndex()              SetPixelIndex()
GetPixelL()                  SetPixelL()
GetPixelMagenta()            SetPixelMagenta()
GetPixelReadMask()           SetPixelReadMask()
GetPixelWriteMask()          SetPixelWriteMask()
GetPixelMetacontentExtent()  SetPixelMetacontentExtent()
GetPixelOpacity()            SetPixelOpacity()
GetPixelRed()                SetPixelRed()
GetPixelYellow()             SetPixelYellow()
GetPixelY()                  SetPixelY()

Estos métodos de acceso están definidos en el archivo de cabecera MagickCore/pixel-accessor.h

Rasgos de píxel

Cada canal de píxel incluye uno o más de estos rasgos:

Undefined
ningún rasgo asociado a este canal de píxel
Copy
no actualizar este canal de píxel, simplemente copiarlo
Update
actualizar este canal de píxel
Blend
mezclar este canal de píxel con la máscara alfa si está habilitada

Proporcionamos estos métodos para establecer y obtener los rasgos de píxel:

GetPixelAlphaTraits()    SetPixelAlphaTraits()
GetPixelBlackTraits()    SetPixelBlackTraits()
GetPixelBlueTraits()     SetPixelBlueTraits()
GetPixelCbTraits()       SetPixelCbTraits()
GetPixelChannelTraits()  SetPixelChannelTraits()
GetPixelCrTraits()       SetPixelCrTraits()
GetPixelGrayTraits()     SetPixelGrayTraits()
GetPixelGreenTraits()    SetPixelGreenTraits()
GetPixelIndexTraits()    SetPixelIndexTraits()
GetPixelMagentaTraits()  SetPixelMagentaTraits()
GetPixelRedTraits()      SetPixelRedTraits()
GetPixelYellowTraits()   SetPixelYellowTraits()
GetPixelYTraits()        SetPixelYTraits()

Por conveniencia, puede establecer el rasgo activo para un conjunto de canales de píxel con una máscara de canal y este método:

SetImageChannelMask()

Anteriormente, los métodos de MagickCore tenían análogos de canal, por ejemplo, NegateImage() y NegateImageChannels(). Los métodos análogos de canal ya no son necesarios porque los rasgos del canal de píxel especifican si actuar sobre un canal de píxel concreto o si mezclar con la máscara alfa. Por ejemplo, en lugar de

NegateImageChannel(image,channel);

usamos:

channel_mask=SetImageChannelMask(image,channel);
NegateImage(image,exception);
(void) SetImageChannelMask(image,channel_mask);

Canales de usuario de píxel

En la versión 7, introducimos los canales de usuario de píxel. Tradicionalmente utilizamos 4 canales: rojo, verde, azul y alfa. Para CMYK también tenemos un canal negro. Los canales de usuario están diseñados para contener cualquier información de canal adicional que tenga sentido para su aplicación. Algunos ejemplos incluyen canales adicionales en imágenes TIFF o PSD, o quizá necesite un canal con información infrarroja para el píxel. Puede asociar rasgos a los canales de usuario de modo que, cuando un algoritmo de procesamiento de imágenes actúe sobre ellos (por ejemplo, desenfoque), los píxeles se copien, se procesen con el algoritmo o incluso se mezclen con el canal alfa si tiene sentido.

Metacontenido de píxel

En la versión 7, introducimos el metacontenido de píxel. El metacontenido es contenido sobre el contenido. Así que, en lugar de ser el contenido en sí, es algo que describe o está asociado al contenido. Aquí el contenido es un píxel. El metacontenido de píxel es para su uso exclusivo (internamente los datos simplemente se copian, no se modifican) y se accede con estos métodos de la API MagickCore:

SetImageMetacontentExtent()
GetImageMetacontentExtent()
GetVirtualMetacontent()
GetAuthenticMetacontent()
GetCacheViewAuthenticMetacontent()
GetCacheViewVirtualMetacontent()

Alfa

Ahora admitimos alfa, antes opacidad. Con alfa, un valor de 0 significa que el píxel no tiene ninguna información de cobertura y es transparente; es decir, no hubo contribución de color de ninguna geometría porque la geometría no se superpuso a este píxel. Un valor de QuantumRange significa que el píxel es opaco porque la geometría se superpuso completamente al píxel. Como consecuencia, en la versión 7, el miembro alpha de la estructura PixelInfo ha reemplazado al anterior miembro opacity. Otra consecuencia es que la parte alfa de un valor sRGB en notación hexadecimal ahora está invertida (por ejemplo, #0000 es completamente transparente).

Espacio de color

Los espacios de color Rec601Luma y Rec709Luma ya no se admiten. En su lugar, especifique el espacio de color gray y elija entre estas opciones de intensidad:

Rec601Luma
Rec601Luminance
Rec709Luma
Rec709Luminance

Por ejemplo,

magick myImage.png -intensity Rec709Luminance -colorspace gray myImage.jpg

Escala de grises

Anteriormente, las imágenes en escala de grises eran Rec601Luminance y consumían 4 canales: rojo, verde, azul y alfa. Con la versión 7, la escala de grises consume solo 1 canal, requiriendo muchos menos recursos como resultado.

Máscaras

La versión 7 admite máscaras para la mayoría de los operadores de imagen. Los píxeles blancos en una máscara de lectura ignoran el píxel correspondiente de una imagen, mientras que los píxeles blancos en una máscara de escritura protegen el píxel correspondiente de la imagen. Desde la línea de comandos, puede asociar una máscara a una imagen con las opciones -read-mask y -write-mask. Esta polaridad coincide con las máscaras de la versión 6 de ImageMagick para facilitar la migración de su flujo de trabajo. Por conveniencia, seguimos admitiendo la opción -mask en la versión 7 para coincidir con el comportamiento de la versión 6.

En este ejemplo, calculamos la distorsión de una imagen reconstruida con máscara:

compare -metric rmse -read-mask hat_mask.png hat.png wizard.png difference.png

Aquí protegemos ciertos píxeles de cambios:

magick rose: -write-mask rose_bg_mask.png -modulate 110,100,33.3  +write-mask rose_blue.png

Una máscara asociada a una imagen persiste hasta que se modifica o elimina. Esto puede producir resultados inesperados con líneas de comandos complejas. Aquí solo queremos recortar al aplicar la opción alpha, no al redimensionar:

magick -density 300 -colorspace srgb image.eps -alpha transparent -clip -alpha opaque +clip -resize 1000x1000 -strip image.png

API MagickCore

Aquí hay una lista de cambios en la API MagickCore:

  • Casi todos los algoritmos de procesamiento de imágenes ahora reconocen los canales.
  • La API MagickCore añade un argumento ExceptionInfo a los métodos que carecían de él en la versión 6, por ejemplo, NegateImage(image,MagickTrue,exception)
  • Se han eliminado todos los métodos análogos de canal (por ejemplo, BlurImageChannel()); ya no son necesarios, use los rasgos de píxel en su lugar.
  • Las llamadas de API públicas y privadas ahora se declaran con el atributo de visibilidad de GCC. Las bibliotecas dinámicas MagickCore y MagickWand ahora solo exportan declaraciones públicas de estructuras y funciones.
  • La enumeración InterpolatePixelMethod ahora es PixelInterpolateMethod.
  • El tipo de almacenamiento IntegerPixel se ha eliminado (use LongPixel en su lugar) y se ha añadido LongLongPixel.
  • Las firmas de imagen han cambiado para tener en cuenta los canales de píxel variables.
  • Todas las estructuras de paquete de color, PixelPacket, LongPacket y DoublePacket, se han consolidado en una única estructura de color, PixelInfo.
  • El miembro I de la estructura ChannelMoments ahora es invariante. I entra en conflicto con la cabecera complex.h.
  • Añadimos un parámetro de longitud a FormatMagickSize() para permitir búferes de longitud variable.

API MagickWand

Aquí hay una lista de cambios en la API MagickWand:

  • Casi todos los algoritmos de procesamiento de imágenes ahora reconocen los canales.
  • El método DrawMatte() ahora se llama DrawAlpha().
  • Los métodos MagickSetImageBias() y MagickSetImageClipMask() ya no se admiten.

API Magick++

Aquí hay una lista de cambios en la API Magick++:

  • Casi todos los algoritmos de procesamiento de imágenes ahora reconocen los canales.
  • Use esta construcción, por ejemplo, para evitar operar sobre el canal alfa:
    image.negateChannel(Magick::ChannelType(Magick::CompositeChannels ^ Magick::AlphaChannel));
    

Archivos de cabecera

Las versiones anteriores de ImageMagick (4-6) referencian los archivos de cabecera de ImageMagick como magick/ y wand/. ImageMagick 7 usa en su lugar MagickCore/ y MagickWand/ respectivamente. Por ejemplo,

#include <MagickCore/MagickCore.h>
#include <MagickWand/MagickWand.h>

Funciones obsoletas eliminadas

Todas las funciones obsoletas de ImageMagick versión 6 se han eliminado en la versión 7. Estas incluyen las utilidades de configuración Magick-config y Wand-config. En su lugar use:

MagickCore-config
MagickWand-config

El método FilterImage() se ha eliminado. Use ConvolveImage() en su lugar.

Además, todos los métodos obsoletos de MagickCore y MagickWand ya no están disponibles en la versión 7.

El filtro Bessel se eliminó porque es un alias de Jinc. Use -filter Jinc en su lugar.

API de shell o interfaz de línea de comandos

Como se mencionó, el enfoque principal de los cambios en la API de shell o interfaz de línea de comandos es la abstracción, de modo que las opciones no solo puedan leerse desde los argumentos de la línea de comandos, sino también desde un archivo (script) o desde un flujo de archivos (comandos interactivos o coprocesamiento).

Para ello, el analizador de la CLI necesitaba ser reescrito, para realizar siempre todas las opciones en un orden estricto, ejecutándolas tal como se ven. Anteriormente en IMv6 las opciones se realizaban en grupos (conocidos como 'FireOptions'); esa incomodidad ya no existe. Sin embargo, el orden estricto significa que ya no puede dar operaciones antes de proporcionar una imagen sobre la que dichas operaciones deban actuar. Hacerlo ahora producirá un error.

El informe de errores ahora informa exactamente qué opción (por número de argumento en la línea de comandos, o línea, columna en los scripts) causó la «excepción». Esto aún no está completo, pero va mejorando. Tampoco está completo el manejo de 'regard-warnings' o su reemplazo, que le permitirá ignorar los errores informados y continuar el procesamiento (según corresponda debido al error) en coprocesos o en uso interactivo.

Con el analizador de IMv7, activado por la utilidad magick, los ajustes se aplican a cada imagen en memoria por turno (si las hay). Mientras que una option: solo necesita aplicarse una vez de forma global. Usar las otras utilidades directamente, o como argumento de la CLI magick (por ejemplo, magick), utiliza el analizador heredado.

Las opciones de paréntesis que se usaban para «empujar» la lista de imágenes actual y los ajustes de imagen (p. ej., '(' y ')' ) a una pila tienen ahora una pila de ajustes de imagen completamente separada. Es decir, los paréntesis «empujan/sacan» listas de imágenes, y las llaves (p. ej., '{' y '}' ) «empujarán/sacarán» los ajustes de imagen.

Por supuesto, debido a los cambios previamente informados en el manejo subyacente de los canales, habrá muchos efectos secundarios en casi todas las opciones. Aquí hay algunos específicos.

La mayoría de los algoritmos actualizan los canales rojo, verde, azul, negro (para CMYK) y alfa. La mayoría de los operadores mezclan alfa con los otros canales de color, pero otros operadores (y situaciones) pueden requerir que esta mezcla se deshabilite, y actualmente se hace eliminando alfa de los canales activos mediante la opción -channel (p. ej., magick castle.gif -channel RGB -negate castle.png).

Leer imágenes en escala de grises genera una imagen con un solo canal. Si esa imagen va a aceptar luego color, es necesario aplicar el ajuste -colorspace para expandir el único canal en canales RGB (u otros) separados.

Anteriormente, los argumentos de la línea de comandos estaban limitados a 4096 caracteres; con ImageMagick versión 7 el límite ha aumentado a 131072 caracteres.

Cambios de comandos

Aquí hay una lista de cambios en los comandos de ImageMagick:

magick
IMPORTANTE: El comando " magick" es el nuevo comando principal de la API de shell, reemplazando al antiguo comando "convert". Esto le permite crear un 'script magick' de la forma "#!/path/to/command/magick -script", o canalizar opciones hacia un comando "magick -script -", como proceso en segundo plano.
magick-script
Es lo mismo que "magick" (solo difiere el nombre del comando), pero que tiene una opción "-script" implícita. Esto le permite usarlo en una forma de script al estilo "env". Es decir, un script magick comienza con la línea 'she-bang' "#!/usr/bin/env magick-script", permitiendo que el intérprete del script se encuentre en cualquier lugar del "PATH" de comandos del usuario. Esto es necesario para sortear un "error de la she-bang de un solo argumento" que es común en la mayoría de los sistemas UNIX (incluido Linux, pero no MacOSX).
animate, compare, composite, conjure, convert, display, identify, import, mogrify, montage, stream
Para reducir la huella de las utilidades de línea de comandos, estas utilidades son enlaces simbólicos a la utilidad magick. En Windows estas utilidades se instalan como ejecutables separados y el ejecutable heredado convert ya no se incluye. También puede invocarlas desde la utilidad magick; por ejemplo, use magick logo: logo.png para invocar la utilidad magick. (En otras palabras, llame a estas utilidades anteponiéndoles magick, como magick compare, magick identify, magick mogrify, magick montage, etc. No use magick convert. Eso es simplemente magick)

Cambios de comportamiento

Los ajustes de imagen se aplican a cada imagen en la línea de comandos. Para asociar un ajuste con una imagen concreta, use paréntesis para eliminar la ambigüedad. En este ejemplo asignamos un desplazamiento de página único a cada imagen:

magick \( -page +10+20 first.png \) \( -page +100+200 second.png \) ...

Por defecto, las operaciones de imagen como la convolución mezclan alfa con cada canal. Para convolucionar cada canal de forma independiente, desactive el canal alfa de la siguiente manera:

magick ... -alpha discrete -blur 0x1 ...

Para eliminar los valores alfa de su imagen, use -alpha off. Si en cambio desea conservar el canal alfa pero no mezclar los píxeles alfa en ciertas operaciones de procesamiento de imágenes, use -alpha deactivate en su lugar.

Algunas opciones han cambiado en ImageMagick versión 7. Estas incluyen:

-channel
el valor por defecto es actualizar los canales RGBA; anteriormente, en IMv6, el valor por defecto era RGB. Si obtiene resultados que difieren de IMv6, quizá necesite especificar -channel RGB en su línea de comandos (p. ej., -channel RGB -negate).
+combine
Esta opción ahora requiere un argumento, el espacio de color de la imagen (p. ej., +combine sRGB).
-format
La propiedad de imagen %Z ya no se admite.
-gamma
Múltiples argumentos gamma (p. ej., -gamma 1,2,3) ya no se admiten; en su lugar use -channel (p. ej., -channel blue -gamma 2).
-region
Esta opción establece una máscara de escritura para la región que defina. En IMv6, en su lugar se clonaba una imagen separada, se operaba sobre ella y los resultados se componían sobre la imagen de origen. Además, las transformaciones de draw son relativas a la esquina superior izquierda de la imagen; anteriormente en IMv6 eran relativas a la región.

Use -define morphology:showKernel=1 para mostrar el núcleo de morfología o convolución. Anteriormente era -define showKernel=1.

Nuevas opciones

ImageMagick versión 7 admite estas nuevas opciones, aunque la mayoría están limitadas al comando "magick" o al uso en scripts "magick".

{ ... }
Guardar (y restaurar) los ajustes de imagen actuales (conocidos internamente como la estructura "image_info"). Esto se hace automáticamente con paréntesis (p. ej., '(' y ')') si se ha establecido "-regard-parenthesis", igual que en IMv6. Se aconseja precaución para evitar errores de llaves desequilibradas.
--
Fin de las opciones, para usarse en el comando "mogrify" de IMv7 para separar explícitamente las operaciones que se aplicarán y las imágenes que se procesarán «in situ». (aún no implementado). Sin embargo, si no se proporciona, "-read" aún puede usarse para diferenciar las lecturas secundarias de imágenes (para usar en cosas como la composición alfa) de la imagen «in situ» que se está procesando. En otros comandos (como "magick") es equivalente a un "-read" explícito (ver abajo) de la siguiente opción como una imagen (como lo era en IMv6).
-alpha activate/deactivate
habilita y deshabilita el canal alfa, respectivamente, con persistencia. Esto es como on/off en ImageMagick 6. En ImageMagick 7, -alpha off eliminará el canal alfa permanentemente, de modo que -alpha on no lo reactivará.
-alpha discrete
tratar el canal alfa de forma independiente (no mezclar).

-channel-fx expression

intercambiar, extraer o copiar uno o más canales de imagen.

La expresión consta de uno o más canales, mnemónicos o numéricos (p. ej., red o 0, green o 1, etc.), separados por ciertos símbolos de operación de la siguiente manera:

<=>  intercambiar dos canales (p. ej., red<=>blue)
=>   copiar un canal a otro canal (p. ej., red=>green)
=    asignar un valor constante a un canal (p. ej., red=50%)
,    escribir una nueva imagen con los canales en el orden especificado (p. ej., red, green)
;    añadir una nueva imagen de salida para el siguiente conjunto de operaciones de canal (p. ej., red; green; blue)
|    pasar a la siguiente imagen de entrada como origen de los datos de canal (p. ej., | gray=>alpha)

Por ejemplo, para crear 3 imágenes en escala de grises a partir de los canales rojo, verde y azul de una imagen, use:

-channel-fx "red; green; blue"

Un canal sin símbolo de operación implica separar (es decir, punto y coma).

Aquí tomamos una imagen sRGB y una imagen en escala de grises e inyectamos la imagen en escala de grises en el canal alfa:

magick wizard.png mask.pgm -channel-fx '| gray=>alpha' wizard-alpha.png

Use un comando similar para definir una máscara de lectura:

magick wizard.png mask.pgm -channel-fx '| gray=>read-mask' wizard-mask.png

Añada -debug pixel antes de la opción -channel-fx para rastrear la morfología del canal.

-exit
Detener el procesamiento en este punto. No se procesará ninguna opción adicional después de esta opción. Puede usarse en un script para forzar la salida del comando "magick", sin cerrar realmente la canalización desde la que está procesando las opciones. También puede usarse como opción «final» en la línea de comandos de "magick", en lugar de una imagen de salida implícita, para impedir por completo cualquier escritura de imagen. APARTE: ¡incluso el codificador "NULL:" requiere al menos una imagen para «no escribir»! Esta opción no requiere ninguna imagen en absoluto.
-read
Lectura explícita de una imagen, en lugar de una lectura implícita. Esto le permite leer desde nombres de archivo que comienzan con un carácter de «opción», y que de otro modo podrían confundirse con una opción (desconocida o de otro tipo). Esto se usará eventualmente en "mogrify" para permitir la lectura de imágenes secundarias y permitir el uso de operaciones de lista de imágenes dentro de ese comando.
-read-mask
impedir actualizaciones a los píxeles de imagen especificados por la máscara
-region
admitido en ImageMagick 7.0.2-6 y posteriores
-script
En "magick", detener el procesamiento de los argumentos de la línea de comandos como operaciones de imagen, y leer todas las opciones adicionales desde el archivo o la canalización dados.
-write-mask
impedir que los píxeles sean escritos.

Opciones cambiadas

Se sabe que estas opciones han cambiado de alguna manera.

-bias
La opción ya no se reconoce. Use -define convolve:bias=value en su lugar.
-draw
La primitiva matte ahora es alpha (p. ej., -draw 'alpha 0,0 floodfill').
-negate
actualmente niega todos los canales, incluido alfa si está presente. Por ello quizá necesite usar la opción -channel para impedir la negación de alfa (p. ej., -channel RGB -negate).
-preview
esta opción ahora es un operador de imagen. El formato de imagen PREVIEW se ha eliminado.

Se da advertencia de obsolescencia, pero funcionará (por ahora)

-affine
Reemplazado por -draw "affine ...". (ver transform)
-average
Reemplazado por -evaluate-sequence Mean.
-box
Reemplazado por -undercolor.
-deconstruct
Reemplazado por -layers CompareAny.
-gaussian
Reemplazado por -gaussian-blur.
-/+map
Reemplazado por -/+remap.
-/+mask
Reemplazado por -/+read-mask, -/+write-mask.
-/+matte
Reemplazado por -alpha Set/Off.
-transform
Reemplazado por -distort Affine "...".

Se da advertencia de obsolescencia, y se ignora (por ahora)

Casi toda opción 'plus' (+) que no hacía nada se ha marcado como obsoleta, y no hace nada. Ni siquiera tiene código asociado. Por ejemplo "+annotate", "+resize", "+clut" y "+draw".

-affinity
Reemplazado por -remap.
-maximum
Reemplazado por -evaluate-sequence Max.
-median
Reemplazado por -evaluate-sequence Median.
-minimum
Reemplazado por -evaluate-sequence Min.
-recolor
Reemplazado por -color-matrix.

Opciones eliminadas / reemplazadas (error «no such option» y aborto)

-interpolate filter
eliminar un método de interpolación lento e inútil
-origin
opción antigua, significado desconocido.
-pen
Reemplazado por -fill.
-passphrase
opción antigua, significado desconocido

Mejoras de rendimiento

Operar sobre imágenes en escala de grises mejora significativamente, ya que solo se requiere un canal. Anteriormente, la escala de grises requería tres canales.

El rendimiento de la opción -fx ha aumentado en uno o dos órdenes de magnitud.

Resumen de cambios de la versión 7

Los cambios de ImageMagick versión 6 a la versión 7 se resumen aquí:

Imágenes de alto rango dinámico

  • ImageMagick versión 7 habilita HDRI por defecto. Espere resultados de procesamiento de imágenes más precisos con mayores requisitos de memoria y posibles tiempos de procesamiento más lentos. Puede deshabilitar esta función para sistemas con recursos limitados, como un teléfono móvil, con una ligera pérdida de precisión para ciertos algoritmos (p. ej., el redimensionado).

Píxeles

  • Los píxeles ya no se direccionan con los miembros de la estructura PixelPacket (p. ej., red, green, blue, opacity) sino como un array de canales (p. ej., pixel[PixelRedChannel]).
  • Use macros de conveniencia para acceder a los canales de píxel (p. ej., GetPixelRed(), SetPixelRed()).
  • El canal negro para el espacio de color CMYK ya no se almacena en el canal de índice, antes accedido con GetAuthenticIndexQueue() y GetCacheViewAuthenticIndexQueue(). En su lugar, ahora es un canal de píxel y se accede con las macros de píxel de conveniencia GetPixelBlack() y SetPixelBlack().
  • El canal de índice para imágenes con mapa de colores ya no se almacena en el canal de índice, antes accedido con GetAuthenticIndexQueue() y GetCacheViewAuthenticIndexQueue(). En su lugar, ahora es un canal de píxel y se accede con las macros de píxel de conveniencia GetPixelIndex() y SetPixelIndex().
  • Use GetPixelChannels() para avanzar al siguiente conjunto de canales de píxel.
  • Use el canal de metacontenido para asociar metacontenido a cada píxel.
  • Todas las estructuras de paquete de color, PixelPacket, LongPacket y DoublePacket, se han consolidado en una única estructura de color, PixelInfo.

Alfa

  • Admitimos alfa en lugar de opacidad (0 transparente; QuantumRange opaco).
  • Use GetPixelAlpha() o SetPixelAlpha() para obtener o establecer el valor del canal de píxel alfa.

Escala de grises

  • Las imágenes en escala de grises consumen un canal de píxel en ImageMagick versión 7. Para procesar RGB, establezca el espacio de color en RGB (p. ej., -colorspace sRGB).

Máscaras

  • ImageMagick versión 6 solo admite la máscara de lectura en circunstancias limitadas. La versión 7 admite tanto una máscara de lectura como de escritura. La máscara de lectura es respetada por la mayoría de los algoritmos de procesamiento de imágenes.

API MagickCore

  • Casi todos los algoritmos de procesamiento de imágenes ahora reconocen los canales.
  • MagickCore, versión 7, añade un argumento ExceptionInfo a los métodos que carecían de él en la versión 6, p. ej., NegateImage(image,MagickTrue,exception);
  • Se han eliminado todos los métodos análogos de canal (p. ej., BlurImageChannel()); ya no son necesarios, use los rasgos de píxel en su lugar.
  • Las llamadas de API públicas y privadas ahora se declaran con el atributo de visibilidad de GCC. Las bibliotecas dinámicas MagickCore y MagickWand ahora solo exportan declaraciones públicas de estructuras y funciones.
  • La enumeración InterpolatePixelMethod ahora es PixelInterpolateMethod.
  • Para tener en cuenta los canales de píxel variables, las imágenes pueden devolver ahora una firma diferente.

Métodos obsoletos

  • Todos los métodos obsoletos de MagickCore y MagickWand de ImageMagick versión 6 se eliminan y ya no están disponibles en ImageMagick versión 7.
  • Se eliminan todos los métodos análogos de canal de MagickCore (p. ej., NegateImageChannels()). Para la versión 7, use los rasgos de píxel en su lugar.
  • El método FilterImage() se ha eliminado. Use ConvolveImage() en su lugar.