Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
IWICBitmapFrameEncode
IWICBitmapFrameEncode é a contraparte do codificador da interface IWICBitmapFrameDecode. Você pode implementar essa interface em sua classe de codificação de nível de quadro, que é a classe que faz a codificação real dos bits de imagem para cada quadro.
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 );
};
- Inicializar
- DefinirTamanho e DefinirResolução
- SetPixelFormat
- SetColorContexts
- ObterEscritorDeConsultaDeMetadados
- DefinirMiniatura
- WritePixels
- WriteSource
- Commit
- SetPalette
Inicializar
Initialize é o primeiro método invocado num objetoIWICBitmapFrameEncode após ter sido instanciado. Este método tem um parâmetro, que pode ser definido como NULL. Esse parâmetro representa as opções do codificador e é o mesmo IPropertyBag2 instância que você criou no métodoCreateNewFrame dono decodificador de nível de contêiner e passou de volta para o chamador no parâmetro pIEncoderOptions desse método. Nesse momento, você preencheu a estrutura IPropertyBag2 com propriedades que representam as opções de codificação suportadas pelo codificador de nível de quadro. O chamador agora forneceu valores para essas propriedades para indicar determinados parâmetros de opção de codificação e está passando o mesmo objeto de volta para você inicializar o objeto IWICBitmapFrameEncode. Você deve aplicar as opções especificadas ao codificar os bits de imagem.
SetTamanho e DefinirResolução
SetSize e SetResolution são autoexplicativos. O chamador usa esses métodos para especificar o tamanho e a resolução da imagem codificada.
DefinirFormatoPixel
SetPixelFormat é usado para solicitar um formato de pixel no qual codificar a imagem. Se o formato de pixel solicitado não for suportado, você deverá retornar o GUID do formato de pixel mais próximo que é suportado em pPixelFormat, que é um parâmetro de entrada/saída.
SetColorContexts
SetColorContexts é usada para especificar um ou mais contextos de cores válidos (também conhecidos como perfis de cores) para esta imagem. É importante especificar os contextos de cores, para que um aplicativo que decodifice a imagem posteriormente possa converter do perfil de cor de origem para o perfil de destino do dispositivo que está sendo usado para exibir ou imprimir a imagem. Sem um perfil de cores, não é possível obter cores consistentes em diferentes dispositivos. Isso pode ser frustrante para os usuários finais quando suas fotos parecem diferentes em monitores diferentes e eles não conseguem obter impressões correspondentes ao que veem na tela.
GetMetadataQueryWriter
GetMetadataQueryWriter retorna um IWICMetadataQueryWriter que uma aplicação pode usar para inserir ou editar propriedades de metadados específicas num bloco de metadados na moldura da imagem.
Você pode instanciar um IWICMetadataQueryWriter a partir do IWICComponentFactory de várias maneiras. Você pode criá-lo a partir de seu IWICMetadataBlockWriter, da mesma forma que IWICMetadataQueryReader foi criado a partir de um IWICMetadataBlockReader no método GetMetadataQueryReader na interface IWICBitmapFrameDecode.
IWICMetadataQueryWriter* piMetadataQueryWriter = NULL;
HRESULT hr;
hr = m_piComponentFactory->CreateQueryWriterFromBlockWriter(
static_cast<IWICMetadataBlockWriter*>(this),
&piMetadataQueryWriter);
Você também pode criá-lo a partir de um existente IWICMetadataQueryReader, como o obtido usando o método anterior.
hr = m_piComponentFactory->CreateQueryWriterFromReader(
piMetadataQueryReader, pguidVendor, &piMetadataQueryWriter);
O parâmetro pguidVendor permite especificar um fornecedor específico para o gravador de consulta usar ao instanciar um gravador de metadados. Por exemplo, se tu forneceres os teus próprios gravadores de metadados, pode querer especificar o teu próprio GUID de fornecedor. Você pode passar NULL para esse parâmetro se não tiver uma preferência.
SetThumbnail
SetThumbnail é usado para fornecer uma miniatura. Todas as imagens devem fornecer uma miniatura globalmente, em cada quadro ou em ambos os casos. O métodos GetThumbnail e SetThumbnail são opcionais ao nível do contentor, mas, se um codec retornar WINCODEC_ERR_CODECNOTHUMBNAIL do método GetThumbnail , o Windows Imaging Component (WIC) invocará o método GetThumbnail para o Frame 0. Se nenhuma miniatura for encontrada em nenhum dos lugares, o WIC deve decodificar a imagem completa e dimensioná-la para o tamanho da miniatura, o que pode incorrer em uma grande penalidade de desempenho para imagens maiores.
A miniatura deve ter um tamanho e uma resolução que a tornem rápida de decodificar e exibir. Por esse motivo, as miniaturas são mais comumente imagens JPEG. Observe que, se você usar JPEG para suas miniaturas, não precisará escrever um codificador JPEG para codificá-las ou um decodificador JPEG para decodificá-las. Você deve sempre delegar ao codec JPEG que acompanha a plataforma WIC para codificação e decodificação de miniaturas.
WritePixels
WritePixels é o método usado para passar linhas de varredura de um bitmap na memória para codificação. O método será chamado repetidamente até que todas as linhas de verificação tenham sido passadas. O parâmetro lineCount indica quantas linhas de varrimento devem ser escritas nesta chamada. O parâmetro cbStride indica o número de bytes por linha de varredura. cbBufferSize indica o tamanho do buffer passado no parâmetro pbPixels, que contém os bits de imagem reais a serem codificados. Se a altura combinada das linhas de varredura das chamadas cumulativas for maior do que a altura especificada no método SetSize, retorne WINCODEC_ERR_TOOMANYSCANLINES.
Quando a opçãoWICBitmapEncoderCacheOption estiver configurada para WICBitmapEncoderCacheInMemory, as linhas de varredura devem ser armazenadas em cache na memória até que todas tenham sido processadas. Se a opção de cache do codificador estiver WICBitmapEncoderCacheTempFile, as linhas de verificação deverão ser armazenadas em cache em um arquivo temporário, criado ao inicializar o objeto. Em qualquer um desses casos, a imagem não deve ser codificada até que o chamador chame Commit. No caso em que a opção de cache é WICBitmapEncoderNoCache, o codificador deve codificar as linhas de digitalização à medida que as recebe, se possível. (Em alguns formatos, isso não é possível, e as linhas de verificação devem ser armazenadas em cache até que Commit seja chamado.)
A maioria dos codecs RAW não implementará WritePixels, porque não suportam a alteração dos bits de imagem no ficheiro RAW. Codecs brutos ainda devem implementar WritePixels, no entanto, porque quando os metadados são adicionados, ele pode aumentar o tamanho do arquivo, exigindo que o arquivo seja reescrito no disco. Nesse caso, é necessário ser capaz de copiar os bits de imagem existentes, que é o que o método WritePixels faz.
WriteSource
WriteSource é usado para codificar um objeto IWICBitmapSource. O primeiro parâmetro é um ponteiro para um objeto IWICBitmapSource. O segundo parâmetro é um WICRect que especifica a região de interesse a codificar. Este método pode ser chamado várias vezes consecutivas, desde que a largura de cada retângulo seja a mesma largura da imagem final a ser codificada. Se a largura do retângulo passado no parâmetro prc for diferente da largura especificada no método SetSize, retorne WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS. Se a altura combinada das linhas de varredura de chamadas cumulativas for maior do que a altura especificada no método SetSize, retorne WINCODEC_ERR_TOOMANYSCANLINES.
As opções de cache funcionam da mesma forma com esse método como com o método WritePixels descrito anteriormente.
Confirmar
Commit é o método que serializa os bits de imagem codificados para o fluxo de arquivos e itera através de todos os gravadores de metadados para o quadro solicitando que eles serializem seus metadados para o fluxo. No caso em que a opção de cache do codificador é WICBitmapEncoderCacheInMemory ou WICBitmapEncoderCacheTempFile, esse método também é responsável pela codificação da imagem, e quando a opção de cache é WICBitmapEncoderCacheTempFile, o método Commit também deve excluir o arquivo temporário usado para armazenar em cache os dados da imagem antes da codificação.
Este método é sempre invocado após todas as linhas de varredura ou retângulos que compõem a imagem terem sido processados utilizando ou o método Commit ou o método WriteSource. O tamanho do retângulo final que é composto através das chamadas acumuladas para WritePixels ou WriteSource deve ser o mesmo tamanho que foi especificado no método SetSize. Se o tamanho não corresponder ao tamanho esperado, esse método deverá retornar WINCODECERROR_UNEXPECTEDSIZE.
Para iterar através dos gravadores de metadados e instruir cada gravador de metadados a serializar os seus metadados para o fluxo, invoque GetWriterByIndex para iterar através dos gravadores para cada bloco e invoque IWICPersistStream.Save em cada gravador de metadados.
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);
...
}
SetPalette
Somente codecs que têm formatos indexados precisam implementar o SetPalette método. Se uma imagem usa um formato indexado, use esse método para especificar a paleta de cores usada na imagem. Se o codec não tiver um formato indexado, retorne WINCODEC_ERR_PALETTEUNAVAILABLE neste método.
Tópicos relacionados
-
Conceptual
-
Implementação do IWICBitmapCodecProgressNotification (Encoder)
-
Visão geral do componente Windows Imaging