Udostępnij przez


Implementacja interfejsu IWICBitmapFrameEncode

IWICBitmapFrameEncode

IWICBitmapFrameEncode jest odpowiednikiem kodera interfejsu IWICBitmapFrameDecode. Ten interfejs można zaimplementować w klasie kodowania na poziomie ramki, która jest klasą, która wykonuje rzeczywiste kodowanie bitów obrazu dla każdej ramki.

interface IWICBitmapFrameEncode : public IUnknown
{
   // Required methods
   HRESULT Initialize ( IPropertyBag2 *pIEncoderOptions );
   HRESULT SetSize ( UINT width,
               UINT height );
   HRESULT SetResolution ( double dpiX,
               double dpiY );
   HRESULT SetPixelFormat (WICPixelFormatGUID *pPixelFormat);
   HRESULT SetColorContexts ( UINT cCount,
               IWICColorContext **ppIColorContext );
   HRESULT GetMetadataQueryWriter ( IWICMetadataQueryWriter 
               **ppIMetadataQueryWriter );
   HRESULT SetThumbnail ( IWICBitmapSource *pIThumbnail );
   HRESULT WritePixels ( UINT lineCount,
               UINT cbStride,
               UINT cbBufferSize,
               BYTE *pbPixels );
   HRESULT WriteSource ( IWICBitmapSource *pIWICBitmapSource,
               WICRect *prc );
   HRESULT Commit ( void );

// Optional method
   HRESULT SetPalette ( IWICPalette *pIPalette );
};

Zainicjuj

Initialize jest pierwszą wywoływaną metodą na obiekcie IWICBitmapFrameEncode po jego zainicjowaniu. Ta metoda ma jeden parametr, który może być ustawiony na wartość null. Ten parametr reprezentuje opcje kodera i jest tym samym wystąpieniem IPropertyBag2, które zostało utworzone w metodzie CreateNewFrame w dekoderze na poziomie kontenera i przekazane z powrotem wywołującemu w parametrze pIEncoderOptions tej metody. W tym czasie wypełniono strukturę IPropertyBag2 właściwościami reprezentującymi opcje kodowania obsługiwane przez koder na poziomie ramki. Wywołujący podał teraz wartości dla tych właściwości, aby wskazać pewne parametry opcji kodowania, i przekazuje ten sam obiekt z powrotem do inicjalizacji obiektu IWICBitmapFrameEncode. Określone opcje należy zastosować podczas kodowania bitów obrazu.

UstawRozmiar i UstawRozdzielczość

SetSize i SetResolution są oczywiste. Obiekt wywołujący używa tych metod do określenia rozmiaru i rozdzielczości zakodowanego obrazu.

SetPixelFormat

SetPixelFormat służy do żądania formatu pikseli, w którym ma być zakodowany obraz. Jeśli żądany format pikseli nie jest obsługiwany, należy zwrócić identyfikator GUID najbliższego obsługiwanego formatu pikseli w pPixelFormat, który jest parametrem in/out.

SetColorContexts

SetColorContexts służy do określania co najmniej jednego prawidłowego kontekstu kolorów (nazywanego również profilami kolorów) dla tego obrazu. Ważne jest, aby określić konteksty kolorów, aby aplikacja, która dekoduje obraz w późniejszym czasie, może przekonwertować z profilu koloru źródłowego na profil docelowy urządzenia używanego do wyświetlania lub drukowania obrazu. Bez profilu kolorów nie można uzyskać spójnych kolorów na różnych urządzeniach. Może to być frustrujące dla użytkowników końcowych, gdy ich zdjęcia wyglądają inaczej na różnych monitorach i nie udaje im się uzyskać wydruku odpowiadającego temu, co widzą na ekranie.

GetMetadataQueryWriter

GetMetadataQueryWriter zwraca IWICMetadataQueryWriter, którego aplikacja może użyć do wstawiania lub edytowania określonych właściwości w bloku metadanych w ramce obrazu.

Możesz utworzyć wystąpienie IWICMetadataQueryWriter zIWICComponentFactory na kilka sposobów. Możesz utworzyć to z IWICMetadataBlockWriter, podobnie jak IWICMetadataQueryReader został utworzony z IWICMetadataBlockReader w metodzie GetMetadataQueryReader na interfejsie IWICBitmapFrameDecode.

IWICMetadataQueryWriter* piMetadataQueryWriter = NULL;
HRESULT hr;

hr = m_piComponentFactory->CreateQueryWriterFromBlockWriter( 
      static_cast<IWICMetadataBlockWriter*>(this), 
      &piMetadataQueryWriter);

Można go również utworzyć z istniejącego IWICMetadataQueryReader, takiego jak ten uzyskany przy użyciu poprzedniej metody.

hr = m_piComponentFactory->CreateQueryWriterFromReader( 
      piMetadataQueryReader, pguidVendor, &piMetadataQueryWriter);

Parametr pguidVendor umożliwia określenie konkretnego dostawcy dla modułu zapisywania zapytań, który ma być używany podczas tworzenia instancji modułu zapisywania metadanych. Na przykład, jeśli używasz własnych programów do zapisywania metadanych, możesz chcieć określić swój własny identyfikator GUID dostawcy. Jeśli nie masz preferencji, możesz przekazać NULL do tego parametru.

SetThumbnail

setThumbnail służy do udostępniania miniatury. Wszystkie obrazy powinny zawierać miniaturę globalnie, na każdej ramce lub w obu przypadkach. Metody GetThumbnail i SetThumbnail są opcjonalne w kontekście kontenera, ale jeśli koder zwraca WINCODEC_ERR_CODECNOTHUMBNAIL z metody GetThumbnail, składnik obrazu Windows (WIC) wywoła metodę GetThumbnail dla Frame 0. Jeśli nie znaleziono miniatury w żadnym z miejsc, WIC musi zdekodować pełny obraz i skalować go do rozmiaru miniatury, co może znacząco obniżyć wydajność przy większych obrazach.

Miniatura powinna mieć taki rozmiar i rozdzielczość, by można było szybko ją dekodować i wyświetlać. Z tego powodu miniatury są najczęściej obrazami JPEG. Należy pamiętać, że jeśli używasz formatu JPEG dla miniatur, nie musisz pisać kodera JPEG w celu kodowania ich ani dekodera JPEG w celu ich dekodowania. Zawsze należy delegować koder JPEG dostarczany z platformą WIC na potrzeby kodowania i dekodowania miniatur.

WritePixels

WritePixels to metoda używana do przekazywania wierszy skanowania z mapy bitowej w pamięci na potrzeby kodowania. Metoda zostanie wywołana wielokrotnie do momentu przekazania wszystkich wierszy skanowania. Parametr lineCount wskazuje liczbę wierszy skanowania do zapisania w tym wywołaniu. Parametr cbStride wskazuje liczbę bajtów na linię skanowania. cbBufferSize wskazuje rozmiar buforu przekazanego w parametrze pbPixels, który zawiera rzeczywiste bity obrazu, które mają być zakodowane. Jeśli łączna wysokość linii skanowania z kolejnych wywołań jest większa niż wysokość określona w metodzie SetSize, zwróć WINCODEC_ERR_TOOMANYSCANLINES.

Gdy WICBitmapEncoderCacheOption jest ustawiona na WICBitmapEncoderCacheInMemory, linie skanowania powinny być przechowywane w pamięci aż do momentu ich pełnego przekazania. Jeśli opcja pamięci podręcznej kodera jest WICBitmapEncoderCacheTempFile, linie skanowania powinny być buforowane w pliku tymczasowym, tworzonym podczas inicjowania obiektu. W każdym z tych przypadków obraz nie powinien być zakodowany, dopóki wywołujący nie wywoła Commit. W przypadku, gdy opcja pamięci podręcznej jest WICBitmapEncoderNoCache, koder powinien kodować wiersze skanowania w miarę ich odbierania, jeśli to możliwe. (W niektórych formatach nie jest to możliwe, a wiersze skanowania muszą być buforowane do momentu wywołania zatwierdzenia).

Większość nieprzetworzonych koderów nie implementuje WritePixels, ponieważ nie obsługują zmiany bitów obrazu w pliku nieprzetworzonym. Nieprzetworzone kodety powinny nadal implementować WritePixels, jednak ponieważ po dodaniu metadanych może zwiększyć rozmiar pliku, co wymaga ponownego zapisu pliku na dysku. W takim przypadku konieczne jest skopiowanie istniejących bitów obrazu, co wykonuje metoda WritePixels.

WriteSource

WriteSource służy do kodowania obiektu IWICBitmapSource. Pierwszy parametr jest wskaźnikiem do obiektu IWICBitmapSource. Drugi parametr to WICRect, który określa region zainteresowania kodowaniem. Ta metoda może być wywoływana wiele razy z rzędu, o ile szerokość każdego prostokąta jest taka sama szerokość obrazu końcowego, który ma być zakodowany. Jeśli szerokość prostokąta przekazanego w parametrze prc jest inna niż szerokość określona w metodzie SetSize, zwróć WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS. Jeśli łączna wysokość wierszy skanowania z kolejnych wywołań jest większa niż wysokość określona w metodzie SetSize, zwróć WINCODEC_ERR_TOOMANYSCANLINES.

Opcje pamięci podręcznej działają tak samo jak w przypadku metody WritePixels opisanej wcześniej.

Zatwierdzić

Commit to metoda, która serializuje zakodowane bity obrazu w strumień pliku i przechodzi przez wszystkich pisarzy metadanych dla ramki, które żądają serializacji ich metadanych do strumienia. W przypadku, gdy opcja pamięci podręcznej kodera to WICBitmapEncoderCacheInMemory lub WICBitmapEncoderCacheTempFile, ta metoda jest również odpowiedzialna za kodowanie obrazu, a gdy opcja pamięci podręcznej to WICBitmapEncoderCacheTempFile, metoda Commit powinna również usunąć plik tymczasowy używany do buforowania danych obrazu przed kodowaniem.

Ta metoda jest zawsze wywoływana po przekazaniu wszystkich wierszy skanowania lub prostokątów tworzących obraz przy użyciu metody Commit lub WriteSource. Rozmiar końcowego prostokąta, który składa się za pośrednictwem skumulowanych wywołań writePixels lub WriteSource, musi być taki sam, jak określono w metodzie SetSize. Jeśli rozmiar nie jest zgodny z oczekiwanym rozmiarem, ta metoda powinna zwrócić WINCODECERROR_UNEXPECTEDSIZE.

Aby iterować przez zapisujących metadane i poinformować każdego zapisującego metadane o serializowaniu ich metadanych do strumienia, wywołaj GetWriterByIndex, aby iterować przez zapisujących dla każdego bloku, i wywołaj IWICPersistStream.Save dla każdego zapisującego metadane.

IWICMetadataWriter* piMetadataWRiter = NULL;
IWICPersistStream* piPersistStream = NULL;
HRESULT hr;

for (UINT x=0; x < m_blockCount; x++) 
{
    hr = GetWriterByIndex(x, & piMetadataWriter);
hr = piMetadataWriter->QueryInterface(
IID_IWICPersistStream,(void**)&piPersistStream);

hr = piPersistStream->Save(m_piStream, 
WICPersistOptions.WicPersistOptionDefault, 
true);
...
}

Ustaw Paletę

Tylko kodetki, które mają indeksowane formaty, muszą zaimplementować metodę SetPalette. Jeśli obraz używa indeksowanego formatu, użyj tej metody, aby określić paletę kolorów używanych na obrazie. Jeśli kodek nie ma indeksowanego formatu, zwróć WINCODEC_ERR_PALETTEUNAVAILABLE z tej metody.

koncepcyjne

implementowanie IWICBitmapCodecProgressNotification (Encoder)

implementowanie IWICMetadataBlockWriter

Jak napisać WIC-Enabled CODEC

Składnik programu Windows Imaging — omówienie