Domanda

c'è un modo di leggere solo pochi byte su un campo di tipo BLOB in un database (per questa domanda non importa la marca DB) e determinare se il contenuto binario è l'immagine (si presuppone che è una delle : JPG, GIF, PNG)? Ho una webapp che memorizza i file nel database, e se si tratta di un'immagine, voglio mostrare una miniatura, altrimenti voglio mostrare un'icona ... ma non ho alcuna informazione MIMETYPE memorizzata in qualsiasi altro luogo per il blob (non è il mio design) ... e perché è una webapp, il caricamento delle immagini deve avvenire in una chiamata separata (getImage.ashx) di scrivere il tag .. e quando sto scrivendo il tag non voglio dover leggere l'intero blob in una libreria, determinare se si tratta di un'immagine, ridimensionarla ... ecc ecc ... mi piacerebbe essere in grado di guardare i primi byte e so se ho bisogno di scrivere il tag o no. Non capisco strutture di file immagine / formati abbastanza bene per sapere se c'è qualche sorta di intestazione standard nei primi byte che ho potuto leggere in per dire se si tratta di un file JPG, GIF o PNG.

ha senso?

se si vuole aiutarmi specifico (invece che in genere rispondere se si può fare), allora sto utilizzando .NET C # e SQL 2005

Grazie!

È stato utile?

Soluzione

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

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

JPEG iniziano con FF D8 FF E0 xx xx 4A 46 49 46 00 (EDIT: aggiunta mancante porzione dell'intestazione; xx xx è la lunghezza dell'intestazione, in byte); vedi http://www.obrador.com/essentialjpeg/headerinfo.htm

di riferimento: http://wangrui.wordpress.com/ 2007/06/19 / file-firma-table /

Altri suggerimenti

  • file JPEG iniziano con FF D8 FF
  • file GIF iniziano con GIF89a (47 49 46 38 39)

Questo sta prendendo di nuovo alla vecchia scuola (per le tattiche di accesso ai dati). In ogni caso, è possibile utilizzare un DataReader per afferrare il campo e flusso di risultati, poi basta guardare gli abeti 8 byte per vedere che tipo di immagine che si sta trattando.

Si veda questo articolo per un intro su come allegare uno StreamReader per il vostro datareader .

Detto questo, avrei probabilmente appena ottenere tutti i byte a meno che le immagini sono ginormous, soprattutto perché qualsiasi velocità si guadagna da esaminando l'intestazione potrebbe essere persa quando immergendo nel pozzo una seconda volta.

Un'altra tattica potrebbe essere quello di creare una vista che controlla il campo ed espone il tipo, sulla base dei primi byte di intestazione, in SQL. Tipo un brutto ma funziona in un pizzico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top