Device-Independent Bitmaps
Um bitmap independente de dispositivo (DIB) contém uma tabela de cores . Uma tabela de cores descreve como os valores de pixel correspondem a valores de cores RGB, que descrevem cores produzidas pela emissão de luz. Assim, um DIB pode alcançar o esquema de cores adequado em qualquer dispositivo. Um DIB contém as seguintes informações de cor e dimensão:
- O formato de cor do dispositivo no qual a imagem retangular foi criada.
- A resolução do dispositivo no qual a imagem retangular foi criada.
- A paleta do dispositivo no qual a imagem foi criada.
- Uma matriz de bits que mapeia trigêmeos vermelhos, verdes, azuis (RGB ) para pixels na imagem retangular.
- Um identificador de compactação de dados que indica o esquema de compactação de dados (se houver) usado para reduzir o tamanho da matriz de bits.
As informações de cor e dimensão são armazenadas em uma estrutura de BITMAPINFO, que consiste em uma estrutura deBITMAPINFOHEADER seguida por duas ou mais estruturas de RGBQUAD. A estrutura BITMAPINFOHEADER especifica as dimensões do retângulo de pixel, descreve a tecnologia de cores do dispositivo e identifica os esquemas de compactação usados para reduzir o tamanho do bitmap. O estruturas de RGBQUAD identificam as cores que aparecem no retângulo de pixel.
Existem duas variedades de DIBs:
- Um DIB de baixo para cima, em que a origem está no canto inferior esquerdo.
- Um DIB de cima para baixo, em que a origem está no canto superior esquerdo.
Se a altura de um DIB, conforme indicado pelo Height membro da estrutura do cabeçalho de informações de bitmap, for um valor positivo, é um DIB de baixo para cima; se a altura é um valor negativo, é um DIB de cima para baixo. Os DIBs de cima para baixo não podem ser compactados.
O formato de cor é especificado em termos de uma contagem de planos de cores e bits de cor. A contagem de planos de cor é sempre 1; a contagem de bits de cor é 1 para bitmaps monocromáticos, 4 para bitmaps VGA e 8, 16, 24 ou 32 para bitmaps em outros dispositivos de cores. Um aplicativo recupera o número de bits de cor que um determinado monitor (ou impressora) usa chamando o função GetDeviceCaps, especificando BITSPIXEL como o segundo argumento.
A resolução de um dispositivo de exibição é especificada em pixels por metro. Um aplicativo pode recuperar a resolução horizontal de um monitor de vídeo, ou impressora, seguindo este processo de três etapas.
- Chame o função GetDeviceCaps, especificando HORZRES como o segundo argumento.
- Chame GetDeviceCaps uma segunda vez, especificando HORZSIZE como o segundo argumento.
- Divida o primeiro valor de retorno pelo segundo valor de retorno.
O aplicativo pode recuperar a resolução vertical usando o mesmo processo de três etapas com parâmetros diferentes: VERTRES no lugar de HORZRES e VERTSIZE no lugar de HORZSIZE.
A paleta é representada por uma matriz de estruturas de RGBQUAD que especificam os componentes de intensidade vermelho, verde e azul para cada cor na paleta de cores de um dispositivo de exibição. Cada índice de cores na matriz de paleta mapeia para um pixel específico na região retangular associada ao bitmap. O tamanho desta matriz, em bits, é equivalente à largura do retângulo, em pixels, multiplicada pela altura do retângulo, em pixels, multiplicada pela contagem de bits de cor para o dispositivo. Um aplicativo pode recuperar o tamanho da paleta do dispositivo chamando o função GetDeviceCaps, especificando NUMCOLORS como o segundo argumento.
O Windows suporta a compressão da matriz de paleta para DIBs bottom-up de 8 bpp e 4 bpp. Essas matrizes podem ser compactadas usando o esquema de codificação de comprimento de execução (RLE). O esquema RLE usa valores de 2 bytes, o primeiro byte especificando o número de pixels consecutivos que usam um índice de cores e o segundo byte especificando o índice. Para obter mais informações sobre compactação de bitmap, consulte a descrição do BITMAPINFOHEADER, BITMAPFILEHEADER, BITMAPV4HEADERe BITMAPV5HEADER estruturas.
Um aplicativo pode criar um DIB a partir de um DDB inicializando as estruturas necessárias e chamando o GetDIBits função. Para determinar se um dispositivo suporta essa função, chame a funçãoGetDeviceCaps, especificando RC_DI_BITMAP como o sinalizador RASTERCAPS.
Um aplicativo que precisa copiar um bitmap pode usar TransparentBlt para copiar todos os pixels em um bitmap de origem para um bitmap de destino, exceto os pixels que correspondem à cor transparente.
Um aplicativo pode usar um DIB para definir pixels no dispositivo de exibição chamando o SetDIBitsToDevice ou a funçãoStretchDIBits. Para determinar se um dispositivo suporta a função SetDIBitsToDevice, chame a funçãoGetDeviceCaps, especificando RC_DIBTODEV como o sinalizador RASTERCAPS. Especifique RC_STRETCHDIB como o sinalizador RASTERCAPS para determinar se o dispositivo suporta StretchDIBits.
Um aplicativo que simplesmente precisa exibir um DIB pré-existente pode usar a funçãoSetDIBitsToDevice. Por exemplo, um aplicativo de planilha pode abrir gráficos existentes e exibi-los em uma janela usando a função SetDIBitsToDevice. Para redesenhar repetidamente um bitmap em uma janela, no entanto, o aplicativo deve usar o função BitBlt. Por exemplo, um aplicativo multimídia que combina gráficos animados com som se beneficiaria de chamar o função BitBlt porque ele executa mais rápido do que SetDIBitsToDevice.