Funktionsweise der Windows-Bilderstellungskomponente

Ermittlung und Schiedsverfahren

Bevor ein Bild decodiert werden kann, muss ein geeigneter Codec gefunden werden, der dieses Bildformat decodieren kann. In den meisten Systemen ist kein Ermittlungsprozess erforderlich, da die unterstützten Bildformate hartcodiert sind. Da die WIC-Plattform (Windows Imaging Component) erweiterbar ist, muss das Format eines Bilds identifiziert und mit einem geeigneten Codec verglichen werden.

Um die Laufzeitermittlung zu unterstützen, muss jedes Bildformat über ein Identifizierungsmuster verfügen, das verwendet werden kann, um den entsprechenden Decoder für dieses Format zu identifizieren. (Es wird dringend empfohlen, für neue Dateiformate eine GUID für das Identifizieren des Musters zu verwenden, da es garantiert eindeutig ist.) Das Identifizierungsmuster muss in jede Bilddatei eingebettet werden, die diesem Bildformat entspricht. Jeder Decoder verfügt über einen Registrierungseintrag, der das identifizierende Muster oder muster der Bildformate angibt, die er decodieren kann. Wenn eine Anwendung ein Image öffnen muss, fordert sie einen Decoder von WIC an. WIC sucht die verfügbaren Decoder in der Registrierung und überprüft jeden Registrierungseintrag auf ein identifizierende Muster, das dem in die Imagedatei eingebetteten Muster entspricht. Weitere Informationen zu Decoderregistrierungseinträgen finden Sie unter Encoderspezifische Registrierungseinträge.

Wenn WIC einen einzelnen Decoder findet, der mit dem identifizierenden Muster im Bild übereinstimmt, erstellt es eine instance des Decoders und übergibt die Bilddatei an diesen. Wenn WIC mehr als eine Übereinstimmung findet, ruft es eine Methode namens QueryCapability für jeden übereinstimmenden Decoder auf, um zwischen ihnen zu vermitteln und die beste Übereinstimmung zu finden. Weitere Informationen finden Sie im Abschnitt QueryCapabilities unter Implementieren von IWICBitmapDecoder.

Decodierung

Nachdem der entsprechende Decoder ausgewählt und instanziiert wurde, kommuniziert die Anwendung direkt mit dem Decoder. Der Decoder hat mehrere Aufgaben, die er über verschiedene Schnittstellen implementiert. Diese Dienste können wie folgt klassifiziert werden:

  • Dienste auf Containerebene
  • Dienste auf Frameebene
  • Metadatenenumerationsdienste
  • Native Decodertransformationen
  • Statusbenachrichtigungen und Abbruchunterstützung
  • Rohverarbeitungsdienste

Zu den Diensten auf Containerebene gehören das Abrufen der Miniaturansicht der obersten Ebene (falls unterstützt), die Vorschau, Farbkontexte, die Palette (falls zutreffend) und das Containerformat sowie das Bereitstellen des Zugriffs auf die einzelnen Bildframes im Container. (Einige Container enthalten nur einen einzelnen Frame, während andere, z. B. TIFF (Tagged Image File Format), mehrere Frames enthalten können.) Dieser Satz von Diensten umfasst auch die Bereitstellung von Informationen über den Decoder selbst und seine Funktionen in Bezug auf eine bestimmte Bilddatei.

Einzelne Frames verfügen über eigene Miniaturansichten und können auch über eigene Farbkontexte, Paletten und andere Eigenschaften verfügen, die auf Frameebene verfügbar gemacht werden. Der wichtigste Vorgang, der auf Frameebene ausgeführt wird, ist jedoch die eigentliche Decodierung der Bildbits für diesen Frame.

WIC bietet Metadatenleser für die gängigsten Metadatenformate (IFD, EXIF, IPTC, XMP, APP0, APP1 und andere Formate) und unterstützt auch die Erweiterbarkeit für Metadatenformate von Drittanbietern. Dadurch wird der Codec von der Verantwortung für die Analyse von Metadaten befreit. Der Codec ist jedoch dafür verantwortlich, die Metadatenblöcke aufzulisten und einen Metadatenleser für jeden Block anzufordern. WIC führt die Ermittlung für Metadatenhandler auf die gleiche Weise wie für Codecs durch, basierend auf einem Muster im Blockheader, das einem Muster im Registrierungseintrag des Metadatenhandlers entspricht. Weitere Informationen finden Sie unter Encoderspezifische Registrierungseinträge.

Decoder sind nicht erforderlich, um Transformationsvorgänge nativ zu unterstützen, aber dies ermöglicht erhebliche Leistungsoptimierungen, die eine bessere Endbenutzererfahrung bieten. Beispielsweise kann eine Anwendung eine Pipeline mit verschiedenen Transformationen (Skalierung, Zuschneiden, Drehung und Pixelformatkonvertierung) erstellen, die für ein Bild ausgeführt werden soll, bevor das Bild gerendert wird. Weitere Informationen zu Transformationspipelines finden Sie unter IWICBitmapSource. Nach dem Erstellen einer Transformationspipeline fordert die Anwendung die endgültige Transformation in der Pipeline an, um die Bitmap zu erzeugen, die sich aus dem Anwenden aller Transformationen auf die Bildquelle ergibt. Wenn der Decoder selbst Transformationsvorgänge ausführen kann, fragt WIC, welche der angeforderten Transformationen ausgeführt werden können. Alle angeforderten Transformationen, die der Decoder nicht ausführen kann, werden von WIC für das decodierte Bild ausgeführt, bevor es an den Aufrufer zurückgegeben wird. Diese optimierte Transformationspipeline bietet eine bessere Leistung als die sequenzielle Ausführung jeder Transformation im Arbeitsspeicher, insbesondere wenn einige oder alle Transformationen während des Decodierungsprozesses durchgeführt werden können.

Statusbenachrichtigungen und Abbruchunterstützung ermöglichen es einer Anwendung, Statusbenachrichtigungen für langwierige Vorgänge anzufordern, und ermöglichen es der Anwendung, dem Benutzer die Möglichkeit zu geben, einen Vorgang abzubrechen, der zu lange dauert. Dies ist wichtig, denn wenn ein Benutzer einen Vorgang nicht abbrechen kann, kann er das Gefühl haben, dass der Prozess hängen geblieben ist, und versucht, ihn durch Schließen der Anwendung abzubrechen.

Diese Schnittstellen werden im Abschnitt implementieren eines WIC-fähigen Decoders ausführlich beschrieben.

Zu den Rohdatenverarbeitungsdiensten gehören das Anpassen von Kameraeinstellungen, z. B. Belichtung, Kontrast und Schärfen, oder das Ändern des Farbraums vor der Verarbeitung der rohen Bits.

Codierung

Wie Decoder haben Encoder Verantwortung, die sie über Schnittstellen implementieren. Die Von Encodern bereitgestellten Dienste ergänzen die Dienste, die von Decodern bereitgestellt werden, mit der Ausnahme, dass sie Bilddaten schreiben, anstatt sie zu lesen. Encoder bieten auch Dienste in den folgenden Kategorien:

  • Dienste auf Containerebene
  • Dienste auf Frameebene
  • Metadatenenumeration und Aktualisierungsdienste
  • Unterstützung für Statusbenachrichtigungen und Abbruch

Zu den Diensten auf Containerebene für einen Encoder gehören das Festlegen der Miniaturansicht der obersten Ebene (falls unterstützt), die Vorschau und die Palette (falls zutreffend) sowie das Durchlaufen der einzelnen Bildframes, damit sie in den Container serialisiert werden können.

Dienste auf Frameebene für einen Encoder Spiegel denen für den Decoder, mit der Ausnahme, dass sie die Bilddaten, die Miniaturansicht und jede zugehörige Palette oder andere Komponente schreiben, anstatt sie zu lesen.

Metadatenenumerationsdienste für einen Encoder umfassen außerdem das Durchlaufen der zu schreibenden Metadatenblöcke und das Aufrufen der entsprechenden Metadatenschreiber, um die Metadaten auf den Datenträger zu serialisieren.

Diese Schnittstellen werden im Abschnitt implementieren eines WIC-fähigen Encoders ausführlich beschrieben.

Die Lebensdauer eines Codecs

Ein WIC-Codec wird instanziiert, um ein einzelnes Bild zu verarbeiten, und hat in der Regel eine kurze Lebensdauer. Es wird erstellt, wenn ein Image geladen wird, und wird freigegeben, wenn das Image geschlossen wird. Eine Anwendung kann eine große Anzahl von Codecs gleichzeitig mit überlappenden Lebensdauern verwenden (denken Sie daran, durch ein Verzeichnis mit Hunderten von Bildern zu scrollen), und mehrere Anwendungen können dies gleichzeitig tun.

Obwohl einige Codecs eine Lebensdauer haben, die auf die Lebensdauer des Prozesses, in dem sie sich befinden, festgelegt ist, ist dies bei WIC-Codecs nicht der Fall. Die Windows Vista-Fotogalerie, die Windows-Explorer und die Fotoanzeige sowie zahlreiche andere Anwendungen basieren auf WIC und verwenden Ihren Codec, um Bilder und Miniaturansichten anzuzeigen. Wenn die Lebensdauer Ihres Codecs auf die Lebensdauer des Prozesses festgelegt wurde, verbleibt jedes Mal, wenn ein Bild oder eine Miniaturansicht in der Windows Vista-Explorer angezeigt wurde, der Codec, der zum Decodieren dieses Bilds instanziiert wurde, im Arbeitsspeicher, bis der Benutzer seinen Computer das nächste Mal neu startet. Wenn Ihr Codec nie entladen wird, sind seine Ressourcen tatsächlich "kompromittiert", da sie von keiner anderen Komponente im System verwendet werden können.

So aktivieren Sie einen Codec mit WIC

  1. Implementieren Sie eine Decoderklasse auf Containerebene und eine Decoderklasse auf Frameebene, die die erforderlichen WIC-Schnittstellen zum Decodieren von Bildern und Durchlaufen von Metadatenblöcken verfügbar macht. Dies ermöglicht es allen WIC-basierten Anwendungen, mit Ihrem Codec auf die gleiche Weise zu interagieren, wie sie mit Standardbildformaten interagieren.
  2. Implementieren Sie eine Encoderklasse auf Containerebene und eine Encoderklasse auf Frameebene, die die erforderlichen WIC-Schnittstellen zum Codieren von Bildern und zum Serialisieren von Metadatenblöcken in einer Bilddatei verfügbar macht.
  3. Wenn Ihr Containerformat nicht auf einem TIFF- oder JPEG-Container basiert, müssen Sie möglicherweise Metadatenhandler für die allgemeinen Metadatenformate (EXIF, XMP) schreiben. Wenn Sie jedoch ein TIFF-basiertes oder JPEG-basiertes Containerformat verwenden, ist dies nicht erforderlich, da Sie an die vom System bereitgestellten Metadatenhandler delegieren können.
  4. Betten Sie ein eindeutiges Identifizierungsmuster (wir empfehlen eine GUID) in alle Ihre Bilddateien ein. Dadurch kann Ihr Bildformat während der Ermittlung mit Ihrem Codec abgeglichen werden. Wenn Sie einen WIC-Wrapper für ein vorhandenes Bildformat schreiben, müssen Sie ein Muster von Bits finden, die der Encoder immer in seine Bilddateien schreibt, die für dieses Bildformat eindeutig sind, und dieses Muster als Identifizierende Muster verwenden.)
  5. Registrieren Sie Ihren Codec zur Installationszeit. Dadurch kann Ihr Codec zur Laufzeit ermittelt werden, indem das Identifizierungsmuster in der Registrierung mit dem in die Imagedatei eingebetteten Muster abgegleicht wird.
  6. Ab Windows 7 erfordert WIC, dass Codecs den COM-Apartmenttyp "Both" aufweisen. Dies bedeutet, dass Sie die entsprechenden Sperren durchführen müssen, um apartmentübergreifende Anrufer und Aufrufer in Multithreadszenarien zu verarbeiten. Weitere Informationen finden Sie im nächsten Abschnitt zur Unterstützung von Multithreadwohnungen.
  7. Unterstützung für 64-Bit-Plattformen: Für Windows 7 erfordert WIC, dass WIC-Codecs von Drittanbietern sowohl als native 32-Bit- als auch als 64-Bit-Binärdateien bereitgestellt werden. Darüber hinaus muss das 32-Bit-Formular auf 64-Bit-Systemen installiert und ausgeführt werden, und das Windows 7-Codec-Installationsprogramm von Drittanbietern muss sowohl die 32-Bit- als auch die 64-Bit-Binärdateien auf 64-Bit-Systemen installieren.

Unterstützung für Multithreadwohnungen in WIC

Objekte in einem Multithread-Apartment (MTA) können gleichzeitig von einer beliebigen Anzahl von Threads innerhalb des MTA aufgerufen werden. Dies ermöglicht eine bessere Leistung auf Multikernsystemen und bestimmten Serverszenarien. Darüber hinaus können WIC-Codecs in einem MTA andere Objekte im MTA ohne die Marshallingkosten aufrufen, die mit dem Aufrufen von Threads in verschiedenen STA-Apartments verbunden sind. In Windows 7 wurden alle integrierten WIC-Codecs aktualisiert, um MTAs zu unterstützen, einschließlich JPEG, TIFF, PNG, GIF, ICO und BMP. Es wird dringend empfohlen, Dass Codecs von Drittanbietern geschrieben werden, um MTAs zu unterstützen. Codecs von Drittanbietern, die MTAs nicht unterstützen, verursachen aufgrund von Marshalling erhebliche Leistungskosten in Multithreadanwendungen. Zum Aktivieren der MTA-Unterstützung muss eine ordnungsgemäße Synchronisierung im Drittanbietercodec implementiert werden. Die genaue Implementierung dieser Synchronisierungstechniken geht über den Rahmen dieses Artikels hinaus. Weitere Informationen zum Synchronisieren von COM-Objekten finden Sie unter Grundlegendes und Verwenden von COM-Threadingmodellen.

Konzept

Einführung (Schreiben eines WIC-fähigen Codecs)

Implementieren eines WIC-fähigen Decoders

Schreiben eines WIC-fähigen Codecs

Übersicht über die Windows-Imageerstellungskomponente

Übersicht über WIC-Metadaten