Pergunta

Existe uma maneira de ler apenas alguns bytes fora de um campo de tipo BLOB em um banco de dados (para esta pergunta não importa a marca DB) e determinar se o conteúdo binário é uma imagem (assumir que é um dos : JPG, GIF, PNG)? Eu tenho um webapp que armazena arquivos no banco de dados, e se for uma imagem, eu quero mostrar uma miniatura, caso contrário, eu quero mostrar um ícone ... mas eu não tenho qualquer informação MIMETYPE armazenada em qualquer outro lugar para o blob (não é meu projeto) ... e porque é um webapp, o carregamento das necessidades de imagem para ocorrer em uma chamada separada (getImage.ashx) de escrever a tag .. e quando eu estou escrevendo para fora a tag Eu não quero ter que ler todo o blob em uma biblioteca, determinar se é uma imagem, redimensioná-la ... etc etc ... Eu gostaria de ser capaz de olhar para os primeiros bytes e saber se eu preciso escrever a tag ou não. Eu não entendo estruturas de arquivo de imagem / formatos bem o suficiente para saber se há algum tipo de cabeçalho padrão nos primeiros bytes que eu podia ler-se para dizer se é um JPG, GIF ou PNG.

faz sentido?

Se você quer me ajudar especificamente (em vez de geral de responder se ele pode ser feito), então eu estou usando .NET C # e SQL 2005

Obrigado!

Foi útil?

Solução

PNGs começar com: 89 50 4E 47 0D 0A 1A 0A ; consulte http://www.libpng.org/pub/png /spec/1.2/PNG-Structure.html

GIFs começar com 47 49 46 38 37 61 (GIF87a) ou 47 49 46 38 39 61 (GIF89a) ; consulte http://www.fileformat.info/format/gif/egff.htm

JPEG começar com FF FF D8 E0 xx xx 4A 46 49 46 00 (EDIT: adição de parte do cabeçalho ausente; xx xx é o comprimento de cabeçalho, em bytes); consulte http://www.obrador.com/essentialjpeg/headerinfo.htm

referência: http://wangrui.wordpress.com/ 2007/06/19 / arquivo assinaturas mesa /

Outras dicas

  • arquivos JPEG começar com FF D8 FF
  • arquivos GIF começar com GIF89a (47 49 46 38 39)

Esta é tomá-lo de volta para a velha escola (para táticas de acesso a dados). De qualquer forma, você pode usar um DataReader para pegar os resultados de campo e fluxo, em seguida, basta olhar para os abetos 8 bytes para ver que tipo de imagem que você está lidando.

Consulte este artigo para uma introdução sobre como anexar um StreamReader para o seu datareader .

Tudo o que disse, eu provavelmente só pegar todos os bytes a menos que as imagens são ginormous, principalmente porque qualquer velocidade que você ganha de examinar o cabeçalho poderia ser perdida quando mergulhar no poço pela segunda vez.

Outra tática poderia ser a de criar uma visão que inspeciona o campo e expõe o tipo, com base nos primeiros bytes de cabeçalho, em SQL. Tipo um feio, mas funciona em uma pitada.

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