Como posso verificar a profundidade de cor de um bitmap?
-
23-09-2019 - |
Pergunta
Estou trabalhando em um aplicativo que imprime uma pasta de arquivos de imagem, incluindo JPEG e TIFF. As imagens do TIFF são geralmente em preto e branco (1BPP).
Depois de carregar a imagem, quero determinar se a imagem é Cor ou B&W ou Escala de cinza Para que eu possa enviar a imagem para a impressora direita (impressora colorida ou impressora em preto e branco).
Estou usando o Bitmap
construtor image = new Bitmap(filename);
para carregar a imagem.
EDITAR: A resposta para verificar a profundidade do pixel é ótima para B&W. Alguma idéia de verificar se a imagem está em escala de cinza sem iterar em todos os pixels?
Solução
A maneira correta de verificar isso é:
Para arquivos JPEG, você deve verificar as propriedades apropriadas usando o Propriedade Coleção do bitmap. Isso pode conter o apropriado Exif Tags para ajudar a determinar a profundidade do bit. O próximo passo seria analisar o JPEG Cabeçalho e procure o marcador 'Início do quadro' e, em seguida, o número de componentes na imagem.
O método final é carregar o JPEG em um objeto de bitmap e comparar o número de pixels com o Forumla (largura * altura * bytes_per_pixel). Portanto, se você carregar o bitmap e o número de bytes de dados brutos reais forem iguais a (largura * altura), você sabe que é uma aposta segura que a imagem tem 1 byte por pixel e, como tal, é escala de cinza.
A última coisa que você deseja verificar é o pixelformat do próprio bitmap.
Para o Tiff Formato de arquivo Você deve fazer a mesma coisa usando a coleção PropertyItems e verificar a tag apropriada mencionada na especificação. Se eles falharem, faça a comparação da imagem e, finalmente, use a propriedade Pixelformat como último recurso.
Outras dicas
Basta verificar esta propriedade
image.PixelFormat
Ele corresponderá a um dos valores em System.drawing.imaging.pixelformat
Embora você queira enviar mais do que apenas preto e branco para a impressora B&W, você também deve enviar escalas cinza para lá.