Pergunta

Eu estou carregando um bitmap de um arquivo jpg. Se a imagem não é 24bit RGB, eu gostaria de convertê-lo. A conversão deve ser bastante rápido. As imagens que eu estou carregando são até enorme (9000 * 9000 pixels com um tamanho comprimido de 40-50MB). Como isso pode ser feito?

BTW: Eu não quero usar qualquer bibliotecas externas, se possível. Mas se você sabe de uma classe de utilitário de código aberto execução das tarefas a maioria de imagem comum, eu ficaria feliz em ouvir sobre isso. Agradecemos antecipadamente.

Foi útil?

Solução

O jpeg deve começar com 0xFF 0xd8. Depois disso, você vai encontrar vários campos no formato:

  1. O campo identificador de 2 bytes
  2. comprimento campo, excluindo identificador de campo. 2 bytes.
  3. Os dados variáveis.

Parse através dos campos. O identificador você vai estar procurando é 0xFF 0xC0. Isto é chamado SOF0, e contém altura, largura, profundidade de bit, etc. 0xFF 0xC0 vai ser seguido por dois bytes para o comprimento do campo. Imediatamente a seguir ao que vai ser um único byte que mostra a profundidade de bit, o qual geralmente será 8. Em seguida, haverá dois bytes para altura, dois para largura, e um único byte para o número de componentes; este será geralmente 1 (para tons de cinza) ou 3. (por cor)

Outras dicas

Isto não é algo que eu tentei mesmo, mas eu acho que você pode precisar acccess informações EXIF ??da imagem como um começo.

Confira o blog-entrada de Scott Hanselman sobre como acessar informações EXIF ??das imagens .

Padrão .NET namespace System.Drawing deve ter tudo o que você precisa, mas provavelmente não será muito eficiente. Vai carregar a coisa toda em RAM, descompactá-lo, convertê-lo (provavelmente fazendo uma cópia) e, em seguida, re-comprimir e guardá-lo. Se você apontar para alta performance, eu tenho medo que você pode precisar de olhar para bibliotecas C / C ++ e .NET fazer wrappers para eles.

Tanto quanto eu sei jpg é sempre 24 bpp. A única coisa que poderia mudar seria que de CMY (K?) Em vez de RGB. Essa informação seria armazenado no cabeçalho. Infelizmente eu não tenho qualquer meio de criação de uma imagem CMYK para testar se o carregamento em um Bitmap irá convertê-lo automaticamente.

A linha a seguir irá ler o arquivo na memória:

Bitmap image = Image.FromFile(fileName);

image.PixelFormat irá dizer-lhe o formato de imagem. No entanto, não posso testar o que a carga de arquivos faz com que não sejam jpgs 24bpp RGB arquivos. Só posso recomendar que você experimentá-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top