Implementieren von IWICBitmapSourceTransform
IWICBitmapSourceTransform
Obwohl optional, wird dringend empfohlen, dass jeder Decoder diese Schnittstelle in Ihrer Decodierungsklasse auf Frameebene implementiert, da dies große Leistungsvorteile bieten kann. Wenn eine Anwendung ein bestimmtes Bereichs-, Größen-, Ausrichtungs- oder Pixelformat anfordert, ruft die Windows Imaging Component (WIC) IUnknown::QueryInterface für diese Schnittstelle im IWICBitmapFrameDecode-Objekt auf, anstatt nur das gesamte Bild bei voller Auflösung zu decodieren und dann die angeforderten Transformationen anzuwenden. Wenn der Framedecoder dies unterstützt, ruft WIC die entsprechende Methode oder Methoden auf, um zu bestimmen, ob der Framedecoder die angeforderte Transformation durchführen oder die größe oder das Pixelformat bestimmen kann, das der Decoder dem angeforderten am nächsten kommt. Wenn der Decoder die angeforderte Transformation oder Transformation ausführen kann, ruft WIC CopyPixels mit den entsprechenden Parametern auf. Wenn der Decoder einige, aber nicht alle der angeforderten Transformationen ausführen kann, fordert WIC den Decoder auf, die erforderlichen Auszuführen, und verwendet die WIC-Transformationsobjekte (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotator und IWICFormatConverter), um die verbleibenden Transformationen auszuführen, die vom Framedecoder auf dem Ergebnis des CopyPixels-Aufrufs nicht ausgeführt werden konnten. Wenn der Decoder IWICBitmapSourceTransform nicht unterstützt, muss WIC die Transformationsobjekte verwenden, um alle Transformationen auszuführen. In der Regel ist es für den Decoder viel effizienter, Transformationen während des Decodierungsprozesses auszuführen, als das gesamte Bild zu decodieren und dann die Transformationen auszuführen. Dies gilt insbesondere für Vorgänge wie das Skalieren auf eine viel kleinere Größe oder Pixelformatkonvertierungen.
interface IWICBitmapSourceTransform : IUnknown
{
// Required methods
HRESULT DoesSupportTransform ( WICTransformOptions dstTransform,
BOOL *pfIsSupported);
HRESULT CopyPixels ( WICRect *prcSrc,
UINT uiWidth,
UINT uiHeight,
WICPixelFormatGUID * pguidDstFormat,
WICBitmapTransformOptions dstTransform,
UINT nStride,
UINT cbBufferSize,
BYTE *pbBuffer );
// Optional methods
HRESULT GetClosestSize ( UINT *puiWidth,
UINT *puiHeight);
HRESULT GetClosestPixelFormat ( WICPixelFormatGUID *pguidDstFormat);
}
DoesSupportTransform
DoesSupportTransform fragt, ob der Decoder den angeforderten Dreh- oder Kehrvorgang unterstützt. Die WICBitmapTransformOptions , die angefordert werden können, sind:
enum WICBitmapTransformOptions
{
WICBitmapTransformRotate0,
WICBitmapTransformRotate90,
WICBitmapTransformRotate180,
WICBitmapTransformRotate270,
WICBitmapTransformFlipHorizontal,
WICBitmapTransformFlipVertical
}
Copypixels
CopyPixels führt die eigentliche Decodierung der Bildbits durch, z. B. die CopyPixels-Methode auf der IWICBitmapSource-Schnittstelle , aber die CopyPixels-Methode auf IWICBitmapSourceTransform ist viel leistungsfähiger und kann die Bildverarbeitungsleistung erheblich verbessern.
Wenn mehrere Transformationsvorgänge angefordert werden, hängt das Ergebnis von der Reihenfolge ab, in der die Vorgänge ausgeführt werden. Um Vorhersagbarkeit und Konsistenz zwischen Codecs sicherzustellen, ist es wichtig, dass alle Codecs diese Vorgänge in derselben Reihenfolge ausführen. Dies ist die kanonische Reihenfolge für die Ausführung dieser Vorgänge.
- Skalieren
- Crop
- Rotate
Die Pixelformatkonvertierung kann jederzeit ausgeführt werden, da sie keine Auswirkungen auf die anderen Transformationen hat.
Der erste Parameter , prcSrc, wird verwendet, um den bereich anzugeben, der für das Ausschneiden des Bilds von Interesse ist. Da die Skalierung vor dem Beschneiden nach Konvention erfolgt, sollte der gewünschte Bereich nach der Skalierung des Bilds bestimmt werden, wenn das Bild skaliert und beschnitten werden soll.
Der zweite und der dritte Parameter geben die Größe an, auf die das Bild skaliert werden soll.
Der Parameter pguidDstFormat gibt das angeforderte Pixelformat für das decodierte Bild an. Da WIC bereits GetClosestPixelFormat aufgerufen hat, sollte dies ein Pixelformat sein, das vom Decoder angegeben wurde, dass es unterstützt wird.
Der dstTransform-Parameter gibt den angeforderten Drehwinkel an und gibt an, ob das Bild vertikal, horizontal oder beides gedreht werden soll. Da WIC bereits DoesSupportTransform aufgerufen hat, sollte die angeforderte Transformation eine sein, die vom Decoder bereits angegeben wurde, dass sie unterstützt. Denken Sie daran, dass die Drehung nach dem Skalieren und Beschneiden immer ausgeführt werden sollte.
GetClosestSize
GetClosestSize akzeptiert zwei In/Out-Parameter. Der Aufrufer verwendet die Parameter puiWidth und puiHeight , um die Größe anzugeben, in der der Aufrufer das Bild decodieren möchte. Ein Decoder kann ein Bild jedoch nur auf eine Größe decodieren, die ein Vielfaches seiner DCT-Größe aufweist, und verschiedene Bildformate können unterschiedliche DCT-Größen aufweisen. Der Decoder sollte basierend auf seiner eigenen DCT-Größe bestimmen, ob er der angeforderten Größe am nächsten kommt, und bei der Rückgabe puiWidth und puiHeight auf diese Dimensionen festlegen. Wenn eine größere Größe angefordert wird, der Codec aber kein Upscaling unterstützt, sollte das Original zurückgegeben werden.
GetClosestPixelFormat
GetClosestPixelFormat wird verwendet, um das Pixelformat zu bestimmen, das dem angeforderten Pixelformat am nächsten liegt, das der Decoder ohne Datenverlust bereitstellen kann. Es ist immer besser, in ein größeres Pixelformat als in ein schmaleres Format zu konvertieren, obwohl es die Größe des Bilds erhöht, da es bei Bedarf immer in ein restriktiveres Format umgewandelt werden kann. Nachdem die Daten jedoch verloren gegangen sind, können sie nicht wiederhergestellt werden.
Weitere Lektüre
Weitere Informationen zum Erstellen eines WIC-fähigen Codecs finden Sie unter Implementieren von IWICDevelopRaw.
Zugehörige Themen
-
Referenz
-
Konzept