O formato de arquivo JPEG suporta dados RGB?

5

Estou fazendo alguma programação que envolve a codificação de dados de imagem usando o WIC. Eu usei dados RGB, mas o WIC sempre o trata como BGR. Eu tenho uma pergunta relacionada no Stack Overflow que lida com o lado da programação. No entanto, quero descartar que o problema pode estar relacionado ao WIC ou ao formato de arquivo JPEG.

Esse comportamento normal para um JPEG ou como o WIC trata os dados da imagem?

    
por mhs 23.04.2015 / 04:57

3 respostas

5

Esta é uma grande reescrita da minha resposta com base em informações adicionais fornecidas pelo OP nos comentários, no tópico relacionado no SO e em sua própria resposta.

Does the JPEG file format support RGB data?

RGB tem dois significados.

  1. É um espaço de cores, onde as cores são definidas em termos das cores primárias de vermelho, verde. e azul. O padrão JPEG é baseado no espaço de cores RGB como ponto de partida. É convertido em YCbCr para fins de compactação. Uma descrição bem detalhada do processo de codificação e compactação é fornecida em este artigo da Wikipédia .

  2. RGB significa uma ordem para interpretar os dados de cor armazenados. A resposta de Bob explica por que isso também pode ser interpretado na ordem do BGR. Esse é o significado que causou a confusão que levou a essa questão. Na verdade, não se relaciona com o padrão JPEG, mas com o modo como o WIC manipula os dados.

Uma especificação de arquivo de formato de imagem inclui a definição da sequência de cores. Essa não é a situação neste caso. O WIC está criando um JPEG a partir de dados de imagem brutos. De acordo com o link encontrado, o WIC suporta a ordem RGB e BGR para os dados de entrada, embora ele liste apenas o BGR como entrada para seu Codec JPEG nativo. Então, a questão está se relacionando com o WIC e alimentando o que ele espera ver.

    
por 23.04.2015 / 06:08
5

Embora o formato de dados real lido pelo WIC possa ser controlado, observe que o formato Bitmap independente de dispositivo , comumente usado para dados de imagem não compactados (e contidos dentro da maioria dos arquivos BMP também), armazena cada pixel em 24BPP e 32BPP como um único de 24 bits ou 32 bits palavra little-endian .

Esta imagem descreve muito pouco o endian:

Aimagemédedomíniopúblico,por R. S. Shaw e provenientes de Wikimedia Commons

Como você pode ver, o byte menos significativo vem primeiro e o byte mais significativo vem por último. Um valor ARGB 32BPP seria armazenado na memória e no disco como bytes individuais de 8 bits B, G, R, A. O mesmo vale para um valor RGB de 24BPP, armazenado na memória como B, G, R.

Isso provavelmente explica por que o formato padrão usado pelo WIC parece ser "BGR" - porque essa é a representação padrão na memória, e a conversão para RGB big-endian seria um trabalho adicional que não é feito a menos que seja explicitamente solicitado. / p>

Aliás, os humanos normalmente lêem números como big-endian; na ordem oposta. A representação big-endian byte da mesma palavra 24BPP / 32BPP seria como RGB ou ARGB, mais próxima do que você espera.

    
por 23.04.2015 / 11:13
1

Este fórum diz,

This is covered on MSDN. The JPEG encoder encodes three formats:

  • GUID_WICPixelFormat8bppGray
  • GUID_WICPixelFormat24bppBGR
  • GUID_WICPixelFormat32bppCMYK

If your source data is in a different format, you need to use IWICFormatConverter as part of your chain.

    
por 27.04.2015 / 02:46