Bitmap independente de dispositivo
Um DIB (bitmap independente do dispositivo) contém uma tabela de cores. Uma tabela de cores descreve como os valores de pixel correspondem aos valores de cor RGB , que descrevem as cores produzidas pela emissão de luz. Assim, um DIB pode obter 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 BITMAPINFO , que consiste em uma estrutura BITMAPINFOHEADER seguida por duas ou mais estruturas 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. As estruturas RGBQUAD identificam as cores que aparecem no retângulo de pixel.
Há duas variedades de DIBs:
- Um DIB de baixo para cima, no qual a origem está no canto inferior esquerdo.
- Um DIB de cima para baixo, no qual a origem está no canto superior esquerdo.
Se a altura de um DIB, conforme indicado pelo membro Height da estrutura de cabeçalho de informações de bitmap, for um valor positivo, ele será um DIB de baixo para cima; se a altura for um valor negativo, será um DIB de cima para baixo. 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 cores é 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 cor. Um aplicativo recupera o número de bits de cor que uma exibição específica (ou impressora) usa chamando a função GetDeviceCaps , especificando BITSPIXEL como o segundo argumento.
A resolução de um dispositivo de exibição é especificada em pixels por medidor. Um aplicativo pode recuperar a resolução horizontal para uma exibição de vídeo ou impressora seguindo este processo de três etapas.
- Chame a função GetDeviceCaps , especificando HORZRES como o segundo argumento.
- Chame GetDeviceCaps uma segunda vez, especificando HORZSIZE como o segundo argumento.
- Divida o primeiro valor retornado pelo segundo valor retornado.
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 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 é mapeado para um pixel específico na região retangular associada ao bitmap. O tamanho dessa matriz, em bits, é equivalente à largura do retângulo, em pixels, multiplicado pela altura do retângulo, em pixels, multiplicado pela contagem de bits de cor para o dispositivo. Um aplicativo pode recuperar o tamanho da paleta do dispositivo chamando a função GetDeviceCaps , especificando NUMCOLORS como o segundo argumento.
O Windows dá suporte à compactação da matriz de paleta para DIBs de baixo para cima 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 a compactação de bitmap, consulte a descrição das estruturas BITMAPINFOHEADER, BITMAPFILEHEADER, BITMAPV4HEADER e BITMAPV5HEADER .
Um aplicativo pode criar um DIB de um DDB inicializando as estruturas necessárias e chamando a função GetDIBits . Para determinar se um dispositivo dá suporte a essa função, chame a função GetDeviceCaps , 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 a função SetDIBitsToDevice ou StretchDIBits . Para determinar se um dispositivo dá suporte à função SetDIBitsToDevice , chame a função GetDeviceCaps , especificando RC_DIBTODEV como o sinalizador RASTERCAPS. Especifique RC_STRETCHDIB como o sinalizador RASTERCAPS para determinar se o dispositivo dá suporte a StretchDIBits.
Um aplicativo que simplesmente precisa exibir um DIB pré-existente pode usar a função SetDIBitsToDevice . 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 a função BitBlt . Por exemplo, um aplicativo multimídia que combina elementos gráficos animados com som se beneficiaria de chamar a função BitBlt porque ela é executada mais rápido que SetDIBitsToDevice.