Funktionsweise der Windows Imaging-Komponente
Dieses Thema enthält folgende Abschnitte:
- Ermittlung und Vermittlung
- Decodierung
- Codieren
- Lebensdauer eines Codecs
- How to WIC-enabled a Codec
- Multithread-Apartmentunterstützung in WIC
- Zugehörige Themen
Ermittlung und Vermittlung
Bevor ein Bild decodiert werden kann, muss ein geeigneter Codec gefunden werden, der dieses Bildformat decodieren kann. Da die unterstützten Bildformate in den meisten Systemen hart codiert sind, ist kein Ermittlungsprozess erforderlich. Da die Windows Imaging Component (WIC)-Plattform erweiterbar ist, muss es möglich sein, das Format eines Bilds zu identifizieren und es mit einem geeigneten Codec zu ab passen.
Um die Laufzeitermittlung zu unterstützen, muss jedes Bildformat über ein Identifizierungsmuster verfügen, mit dem der entsprechende Decoder für dieses Format identifiziert werden kann. (Es wird dringend empfohlen, für neue Dateiformate eine GUID für das identifizierende Muster zu verwenden, da es garantiert eindeutig ist.) Das identifizierende Muster muss in jede Bilddatei eingebettet werden, die diesem Bildformat entspricht. Jeder Decoder verfügt über einen Registrierungseintrag, der das Identifizieren von Mustern oder Mustern der Bildformate angibt, die decodiert werden können. Wenn eine Anwendung ein Bild ö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 Identifizierungsmuster, 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 dem Identifizierungsmuster im Bild entspricht, wird eine Instanz des Decoders erstellt und die Bilddatei an ihn übergibt. Wenn WIC mehrere Übereinstimmungen findet, ruft es eine Methode namens QueryCapability für jeden übereinstimmenden Decoder auf, um unter ihnen zu kapseln und die beste Übereinstimmung zu finden. Weitere Informationen finden Sie im Abschnitt QueryCapabilities des Abschnitts Implementing IWICBitmapDecoder ( Implementieren von IWICBitmapDecoder).
Decodierung
Nachdem der entsprechende Decoder ausgewählt und instanziiert wurde, spricht die Anwendung direkt mit dem Decoder. Der Decoder hat mehrere Zuständigkeiten, 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 (sofern unterstützt), die Vorschau, Farbkontexte, die Palette (falls zutreffend) und das Containerformat sowie das Bereitstellen des Zugriffs auf die einzelnen Bildframes innerhalb des Containers. (Einige Container enthalten nur einen einzelnen Frame, während andere, z. B. Tagged Image File Format (TIFF), mehrere Frames enthalten können.) Diese Gruppe 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 verfügen möglicherweise auch über eigene Farbkontexte, Paletten und andere Eigenschaften, 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 stellt Metadatenleser für die gängigsten Metadatenformate (IFD, EXIF, IPTC, XMP, APP0, APP1 und andere Formate) bereit und unterstützt auch die Erweiterbarkeit für Metadatenformate von Drittanbietern. Dadurch wird der Codec von der Verantwortung für die Analyse von Metadaten frei. Der Codec ist jedoch für das Aufzählen der Metadatenblöcke und das Anfordern eines Metadatenlesers für jeden Block verantwortlich. WIC führt die Ermittlung für Metadatenhandler auf die gleiche Weise wie für Codecs aus, 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. Dies ermöglicht jedoch 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 vor dem Rendern des Bilds erfolgen. Weitere Informationen zu Transformationspipelines finden Sie unter IWICBitmapSource. Nach dem Erstellen einer Transformationspipeline fordert die Anwendung die letzte 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 er ausführen kann. 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ücksendet. Diese optimierte Transformationspipeline bietet eine bessere Leistung als jede Transformation sequenziell im Arbeitsspeicher, insbesondere wenn einige oder alle Transformationen während des Decodierungsprozesses durchgeführt werden können.
Statusbenachrichtigungen und Abbruchunterstützung ermöglichen einer Anwendung das Anfordern von Statusbenachrichtigungen für längere Vorgänge und ermöglichen es der Anwendung, dem Benutzer die Möglichkeit zu geben, einen zu langen Vorgang abzubruchen. Dies ist wichtig, denn wenn ein Benutzer einen Vorgang nicht abbrechen kann, kann er das Gefühl haben, dass der Prozess nicht mehr reagiert hat, und versuchen, ihn abzubricht, indem er die Anwendung schließt.
Diese Schnittstellen werden im Abschnitt Implementieren eines WIC-Enabled Decoders ausführlich beschrieben.
Zu den Rohverarbeitungsdiensten gehören das Anpassen der Kameraeinstellungen, z. B. Belichtung, Kontrast und Schärfen, oder das Ändern des Farbraums vor der Verarbeitung der rohen Bits.
Codierung
Wie Decoder haben Encoder Zuständigkeiten, 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 stellen auch Dienste in den folgenden Kategorien zur Verfügung:
- Dienste auf Containerebene
- Dienste auf Frameebene
- Metadatenenumeration und Updatedienste
- Statusbenachrichtigung und Abbruchunterstützung
Zu den Diensten auf Containerebene für einen Encoder gehören das Festlegen der Miniaturansicht der obersten Ebene (sofern unterstützt), der Vorschau und der Palette (falls zutreffend) und das Iterieren der einzelnen Bildframes, damit sie in den Container serialisiert werden können.
Dienste auf Frameebene für einen Encoder spiegeln die Dienste für den Decoder wieder, mit der Ausnahme, dass sie die Bilddaten, die Miniaturansicht und alle zugehörigen Paletten oder andere Komponenten schreiben, anstatt sie zu lesen.
Darüber hinaus umfassen Metadatenenumerationsdienste für einen Encoder das Iterieren 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-Enabled Encoders ausführlich beschrieben.
Lebensdauer eines Codecs
Ein WIC-Codec wird instanziiert, um ein einzelnes Image zu verarbeiten, und hat in der Regel eine kurze Lebensdauer. Er 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 sich überschneidenden Lebensdauern verwenden (denken Sie daran, durch ein Verzeichnis mit Hunderten von Bildern zu scrollen), und dies kann von mehreren Anwendungen gleichzeitig ausgeführt werden.
Obwohl einige Codecs eine Lebensdauer haben, die auf die Lebensdauer des Prozesses, in dem sie sich leben, befingt, ist dies bei WIC-Codecs nicht der Fall. Die Windows Vista Fotogalerie, Windows Explorer und Bildanzeige sowie zahlreiche andere Anwendungen sind auf WIC aufgebaut und verwenden Ihren Codec zum Anzeigen von Bildern und Miniaturansichten. Wenn sich die Lebensdauer Ihres Codecs auf die Lebensdauer des Prozesses besingt, bleibt der zum Decodieren des Bilds instanziierte Codec jedes Mal im Arbeitsspeicher, wenn ein Bild oder eine Miniaturansicht im Windows Vista-Explorer angezeigt wird, bis der Benutzer seinen Computer das nächste Mal neu gestartet hat. Wenn Ihr Codec nie entladen wird, werden seine Ressourcen tatsächlich "geleert", da sie nicht von anderen Komponenten im System verwendet werden können.
How to WIC-enabled a Codec
- Implementieren Sie eine Decoderklasse auf Containerebene und eine Decoderklasse auf Frameebene, die die erforderlichen WIC-Schnittstellen zum Decodieren von Bildern und Zum Iterieren von Metadatenblöcken verfügbar macht. Dadurch können alle WIC-basierten Anwendungen auf die gleiche Weise mit Ihrem Codec interagieren wie mit Standardbildformaten.
- Implementieren Sie eine Encoderklasse auf Containerebene und eine Encoderklasse auf Frameebene, die die erforderlichen WIC-Schnittstellen zum Codieren von Bildern und Serialisieren von Metadatenblöcken in eine Bilddatei verfügbar macht.
- Wenn Ihr Containerformat nicht auf einem TIFF- oder JPEG-Container basiert, müssen Sie möglicherweise Metadatenhandler für die gängigen Metadatenformate (EXIF, XMP) schreiben. Wenn Sie jedoch ein TIFF- oder JPEG-basiertes Containerformat verwenden, ist dies nicht erforderlich, da Sie an die vom System bereitgestellten Metadatenhandler delegieren können.
- Betten Sie ein eindeutiges Identifizierungsmuster (wir empfehlen eine GUID) in alle Bilddateien ein. Dadurch kann Ihr Bildformat während der Ermittlung mit Ihrem Codec übereinstimmen. Wenn Sie einen WIC-Wrapper für ein vorhandenes Bildformat schreiben, müssen Sie ein Bitmuster finden, das der Encoder immer in seine Bilddateien schreibt, die für dieses Bildformat eindeutig sind, und dieses als Identifizierungsmuster verwenden.)
- Registrieren Sie Ihren Codec zum Zeitpunkt der Installation. Dadurch kann Ihr Codec zur Laufzeit gefunden werden, indem das Identifizierungsmuster in der Registrierung mit dem in die Imagedatei eingebetteten Muster übereinstimmen.
- Ab Windows 7 erfordert WIC, dass Codecs den COM-Apartmenttyp "Both" haben. Dies bedeutet, dass Sie die entsprechende Sperre für apartmentübergreifende Aufrufer und Aufrufer in Multithreadszenarios verwenden müssen. Weitere Informationen finden Sie im nächsten Abschnitt zur Multithread-Apartmentunterstützung.
- 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 Installationsprogramm für den drittanbieterspezifischen Windows 7-Codec muss sowohl die 32-Bit- als auch die 64-Bit-Binärdateien auf 64-Bit-Systemen installieren.
Multithread-Apartmentunterstützung in WIC
Objekte innerhalb eines Multithread-Apartment (MTA) können gleichzeitig von einer beliebigen Anzahl von Threads innerhalb des MTA aufgerufen werden. Dies ermöglicht eine bessere Leistung auf Systemen mit mehreren Kernen und bestimmten Serverszenarien. Darüber hinaus können WIC-Codecs in einem MTA andere Objekte im MTA aufrufen, ohne dass die Marshallingkosten für das Aufrufen zwischen Threads in verschiedenen STA-Apartments entstehen. In Windows 7 wurden alle In-Box-WIC-Codecs aktualisiert, um MTAs zu unterstützen, einschließlich JPEG, TIFF, PNG, GIF, ICO und BMP. Es wird dringend empfohlen, Codecs von Drittanbietern zur Unterstützung von MTAs zu schreiben. Codecs von Drittanbietern, die MTAs nicht unterstützen, verursachen aufgrund von Marshalling erhebliche Leistungskosten in Multithreadanwendungen. Die Aktivierung der MTA-Unterstützung erfordert, dass eine ordnungsgemäße Synchronisierung im Drittanbietercodec implementiert wird. Die genaue Implementierung dieser Synchronisierungstechniken geht über den Rahmen dieses Whitepapers hinaus. Weitere Informationen zum Synchronisieren von COM-Objekten finden Sie unter Understanding and Using COM Threading Models.