determinar si blob es una imagen sin tener que cargar todo el campo?
-
12-09-2019 - |
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!
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 conFF D8 FF
- archivos
GIF
comienzan conGIF89a
(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.