Funcionamiento del componente de creación de imágenes de Windows

Detección y arbitraje

Antes de que se pueda descodificar una imagen, se debe encontrar un códec adecuado que pueda descodificar ese formato de imagen. En la mayoría de los sistemas, dado que los formatos de imagen admitidos están codificados de forma rígida, no se requiere ningún proceso de detección. Dado que la plataforma Windows Imaging Component (WIC) es extensible, es necesario poder identificar el formato de una imagen y hacer coincidirlo con un códec adecuado.

Para admitir la detección en tiempo de ejecución, cada formato de imagen debe tener un patrón de identificación que se pueda usar para identificar el descodificador adecuado para ese formato. (Se recomienda encarecidamente que, para los nuevos formatos de archivo, use un GUID para el patrón de identificación, ya que se garantiza que es único). El patrón de identificación debe incrustarse en cada archivo de imagen que se ajuste a ese formato de imagen. Cada descodificador tiene una entrada del Registro que especifica el patrón o patrones de identificación de los formatos de imagen que puede descodificar. Cuando una aplicación necesita abrir una imagen, solicita un descodificador desde WIC. WIC busca los descodificadores disponibles en el Registro y comprueba cada entrada del Registro para obtener un patrón de identificación que coincida con el patrón incrustado en el archivo de imagen. Para obtener más información sobre las entradas del Registro de descodificador, consulte Entradas del Registro específicas del codificador.

Cuando WIC encuentra un único descodificador que coincide con el patrón de identificación de la imagen, crea una instancia del descodificador y pasa el archivo de imagen a ella. Si WIC encuentra más de una coincidencia, invoca un método denominado QueryCapability en cada descodificador coincidente para arbitrar entre ellos y encontrar la mejor coincidencia. Para obtener más información, vea la sección QueryCapabilities de La implementación de IWICBitmapDecoder.

Descodificación

Una vez seleccionado y creado la instancia del descodificador adecuado, la aplicación se comunica directamente con el descodificador. El descodificador tiene varias responsabilidades, que implementa a través de varias interfaces. Estos servicios se pueden clasificar como:

  • Servicios de nivel de contenedor
  • Servicios de nivel de marco
  • Servicios de enumeración de metadatos
  • Transformaciones de descodificador nativas
  • Compatibilidad con notificaciones de progreso y cancelación
  • Servicios de procesamiento sin procesar

Los servicios de nivel de contenedor incluyen la recuperación de la miniatura de nivel superior (si se admite), la vista previa, los contextos de color, la paleta (si procede) y el formato de contenedor, así como proporcionar acceso a los marcos de imagen individuales dentro del contenedor. (Algunos contenedores solo contienen un solo fotograma, mientras que otros, como el formato de archivo de imagen etiquetada (TIFF), pueden contener varios fotogramas). Este conjunto de servicios también incluye proporcionar información sobre el propio descodificador y sus funcionalidades con respecto a un archivo de imagen específico.

Los marcos individuales tienen sus propias miniaturas y también pueden tener sus propios contextos de color, paletas y otras propiedades, que se exponen en el nivel de marco. Sin embargo, la operación más importante realizada en el nivel de fotograma es la descodificación real de los bits de imagen para ese fotograma.

WIC proporciona lectores de metadatos para los formatos de metadatos más comunes (IFD, EXIF, IPTC, XMP, APP0, APP1 y otros formatos), y también admite extensibilidad para formatos de metadatos de terceros. Esto libera el códec de la responsabilidad de analizar los metadatos. Sin embargo, el códec es responsable de enumerar los bloques de metadatos y solicitar un lector de metadatos para cada bloque. WIC realiza la detección para los controladores de metadatos de la misma manera que para los códecs, en función de un patrón del encabezado de bloque que coincida con un patrón en la entrada del registro del controlador de metadatos. Para obtener más información, consulte Entradas del Registro específicas del codificador.

Los descodificadores no son necesarios para admitir de forma nativa las operaciones de transformación, pero al hacerlo se habilitan optimizaciones de rendimiento significativas que proporcionan una mejor experiencia del usuario final. Por ejemplo, una aplicación puede crear una canalización de varias transformaciones (escalado, recorte, rotación y conversión de formato de píxeles) para realizar en una imagen antes de que se represente la imagen. Para más información sobre las canalizaciones de transformación, consulte IWICBitmapSource. Después de crear una canalización de transformación, la aplicación solicita la transformación final en la canalización para generar el mapa de bits que resulta de aplicar todas las transformaciones al origen de la imagen. En ese momento, si el propio descodificador puede realizar operaciones de transformación, WIC pregunta cuál de las transformaciones solicitadas puede realizar. Las transformaciones solicitadas que el descodificador no puede realizar serán realizadas por WIC en la imagen descodificada antes de devolverla al autor de la llamada. Esta canalización de transformación optimizada proporciona un mejor rendimiento que realizar cada transformación secuencialmente en memoria, especialmente cuando se pueden realizar algunas o todas las transformaciones durante el proceso de descodificación.

Las notificaciones de progreso y la compatibilidad con la cancelación permiten a una aplicación solicitar notificaciones de progreso para operaciones largas y también permitir que la aplicación ofrezca al usuario la oportunidad de cancelar una operación que tarda demasiado tiempo. Esto es importante porque si un usuario no puede cancelar una operación, puede sentir que el proceso se ha bloqueado e intente cancelarlo cerrando la aplicación.

Estas interfaces se describen detalladamente en la sección Sobre la implementación de un descodificador habilitado para WIC.

Los servicios de procesamiento sin procesar incluyen ajustar la configuración de la cámara, como la exposición, el contraste y el afilado, o cambiar el espacio de color antes de procesar los bits sin procesar.

Encoding

Al igual que los descodificadores, los codificadores tienen responsabilidades que implementan a través de interfaces. Los servicios que proporcionan los codificadores son complementarios a los servicios proporcionados por los descodificadores, salvo que escriben datos de imagen en lugar de leerlos. Los codificadores también proporcionan servicios en las siguientes categorías:

  • Servicios de nivel de contenedor
  • Servicios de nivel de marco
  • Enumeración de metadatos y servicios de actualización
  • Soporte técnico de notificación y cancelación de progreso

Los servicios de nivel de contenedor para un codificador incluyen establecer la miniatura de nivel superior (si se admite), la vista previa y la paleta (si procede) e iteración a través de los fotogramas de imagen individuales para que se puedan serializar en el contenedor.

Los servicios de nivel de marco para un codificador reflejan los del descodificador, salvo que escriben los datos de imagen, la miniatura y cualquier paleta asociada u otro componente, en lugar de leerlos.

Además, los servicios de enumeración de metadatos para un codificador incluyen la iteración a través de los bloques de metadatos que se van a escribir y la invocación de los escritores de metadatos adecuados para serializar los metadatos en el disco.

Estas interfaces se describen detalladamente en la sección Sobre la implementación de un codificador habilitado para WIC.

Duración de un códec

Se crea una instancia de un códec WIC para controlar una sola imagen y, normalmente, tiene una duración corta. Se crea cuando se carga una imagen y se libera cuando se cierra la imagen. Una aplicación puede usar un gran número de códecs simultáneamente con duraciones superpuestas (piense en desplazarse por un directorio que contiene cientos de imágenes) y es posible que varias aplicaciones lo hagan al mismo tiempo.

Aunque algunos códecs tienen una duración cuyo ámbito es la duración del proceso en el que residen, no es el caso de los códecs WIC. La Galería de fotos de Windows Vista, el Explorador de Windows y el Visor de fotos, así como muchas otras aplicaciones, se basan en WIC y usarán el códec para mostrar imágenes y miniaturas. Si la duración del códec se limitaba a la duración del proceso, cada vez que se mostraba una imagen o miniatura en el Explorador de Windows Vista, el códec creado para descodificar esa imagen permanecerá en memoria hasta la próxima vez que el usuario reinicie su equipo. Si el códec nunca se descarga, sus recursos son, en efecto, "filtrados" porque ningún otro componente del sistema los puede usar.

Habilitación de un códec mediante WIC

  1. Implemente una clase de descodificador de nivel de contenedor y una clase de descodificador de nivel de marco que expone las interfaces WIC necesarias para descodificar imágenes e iterar a través de bloques de metadatos. Esto permite que todas las aplicaciones basadas en WIC interactúen con el códec de la misma manera que interactúan con formatos de imagen estándar.
  2. Implemente una clase de codificador de nivel de contenedor y una clase de codificador de nivel de marco que exponga las interfaces WIC necesarias para codificar imágenes y serializar bloques de metadatos en un archivo de imagen.
  3. Si el formato de contenedor no se basa en un contenedor TIFF o JPEG, es posible que tenga que escribir controladores de metadatos para los formatos de metadatos comunes (EXIF, XMP). Sin embargo, si usa un formato de contenedor basado en TIFF o JPEG, esto no es necesario porque puede delegar en los controladores de metadatos proporcionados por el sistema.
  4. Inserte un patrón de identificación único (se recomienda un GUID) en todos los archivos de imagen. Esto permite que el formato de imagen coincida con el códec durante la detección. Si está escribiendo un contenedor WIC para un formato de imagen existente, debe encontrar un patrón de bits que el codificador siempre escribe en sus archivos de imagen únicos para ese formato de imagen y usarlo como patrón de identificación).
  5. Registre el códec en el momento de la instalación. Esto permite que el códec se detecte en tiempo de ejecución mediante la coincidencia del patrón de identificación en el registro con el patrón incrustado en el archivo de imagen.
  6. A partir de Windows 7, WIC requiere que los códecs sean del tipo de apartamento COM "Both". Esto significa que debe realizar el bloqueo adecuado para controlar los autores de llamadas y los autores de llamadas entre apartamentos en escenarios multiproceso. Para obtener más información, consulte la sección siguiente sobre compatibilidad con apartamentos multiproceso.
  7. Compatibilidad con plataformas de 64 bits: para Windows 7, WIC requerirá que los códecs WIC de terceros se entreguen como binarios nativos de 32 y 64 bits. Además, el formulario de 32 bits debe instalarse y ejecutarse en sistemas de 64 bits, y el instalador de códec de Windows 7 de terceros debe instalar los archivos binarios de 32 y 64 bits en sistemas de 64 bits.

Compatibilidad con apartamentos multiproceso en WIC

Los objetos de un apartamento multiproceso (MTA) pueden llamarse simultáneamente por cualquier número de subprocesos dentro del MTA. Esto permite un mejor rendimiento en sistemas de varios núcleos y en determinados escenarios de servidor. Además, los códecs WIC de un MTA pueden llamar a otros objetos del MTA sin el costo de serialización asociado a la llamada entre subprocesos en diferentes apartamentos STA. En Windows 7, todos los códecs WIC incorporados se han actualizado para admitir mtAs, incluidos JPEG, TIFF, PNG, GIF, ICO y BMP. Se recomienda encarecidamente escribir códecs de terceros para admitir mtAs. Los códecs de terceros que no admiten mtAs provocan costos de rendimiento significativos en aplicaciones multiproceso debido a la serialización. La habilitación de la compatibilidad con MTA requiere la sincronización adecuada para implementarse en el códec de terceros. La implementación exacta de estas técnicas de sincronización está fuera del ámbito de este documento. Para obtener más información sobre la sincronización de objetos COM, vea Descripción y uso de modelos de subprocesos COM.

Conceptual

Introducción (cómo escribir un códec habilitado para WIC)

Implementación de un descodificador habilitado para WIC

Cómo escribir un códec habilitado para WIC

Información general del componente de creación de imágenes de Windows

Introducción a los metadatos de WIC