Pregunta

¿Hay una manera de leer solamente unos pocos bytes fuera de un campo de tipo BLOB en una base de datos (para esta pregunta no importa la marca DB) y determinar si el contenido binario es una imagen (asuma que es una de : JPG, GIF, PNG)? Tengo una aplicación web que almacena los archivos en la base de datos, y si se trata de una imagen, quiero mostrar una imagen en miniatura, de lo contrario Quiero mostrar un icono ... pero no tengo ninguna información MIMETYPE almacenada en cualquier otro lugar de la mancha (no es mi diseño) ... y porque se trata de una aplicación web, la carga de la imagen tiene que ocurrir en una llamada independiente (getImage.ashx) de escribir la etiqueta .. y cuando estoy escribiendo la etiqueta no quiero tener que leer todo el blob en una biblioteca, determinar si se trata de una imagen, cambiar su tamaño ... etc etc ... me gustaría ser capaz de mirar a los primeros bytes y sé si tengo que escribir la etiqueta o no. No entiendo las estructuras de archivos de imagen / formatos suficientemente bien como para saber si hay algún tipo de encabezado estándar en los primeros bytes que podía leer en saber si es un archivo JPG, GIF o PNG.

sentido?

Si quieres ayudarme específicamente (en lugar de en general, responder acerca de si se puede hacer), entonces estoy usando C # .NET y SQL 2005

Gracias!

¿Fue útil?

Solución

PNG comienzan con: 89 50 4E 47 0D 0A 1A 0A ; ver http://www.libpng.org/pub/png /spec/1.2/PNG-Structure.html

GIF comienzan con 47 49 46 38 37 61 (GIF87a) o 47 49 46 38 39 61 (GIF89a) ; ver http://www.fileformat.info/format/gif/egff.htm

Los archivos JPEG comienzan con FF FF D8 E0 4A xx xx 46 49 46 00 (EDIT: la adición de la porción faltante de la cabecera; xx xx es la longitud de la cabecera, en bytes); ver http://www.obrador.com/essentialjpeg/headerinfo.htm

referencia: http://wangrui.wordpress.com/ 2007/06/19 / file-firmas-mesa /

Otros consejos

  • archivos JPEG comienzan con FF D8 FF
  • archivos GIF comienzan con GIF89a (47 49 46 38 39)

Esto está tomando de nuevo a la vieja escuela (para las tácticas de acceso a datos). De todos modos, se puede utilizar un DataReader para agarrar el campo y flujo de resultados, a continuación, basta con ver los abetos 8 bytes para ver qué tipo de imagen que está tratando.

Vea este artículo para obtener una introducción sobre cómo adjuntar un StreamReader para su datareader .

Dicho todo esto, probablemente me acaba de obtener todos los bytes a menos que las imágenes son descomunal, principalmente debido a cualquier velocidad que obtiene al examinar el encabezado podría perderse cuando se sumerge en el pozo por segunda vez.

Otra táctica podría ser la creación de una visión que inspecciona el campo y expone el tipo, basado en los primeros bytes de cabecera, en SQL. Un tipo feo, pero funciona en caso de apuro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top