Determina se una stringa base64 o un buffer contiene JPEG o PNG senza metadati? Possibile? B

C’è un modo per farlo usando il nodo, sia in modo nativo o con un plugin?

Quello che sto cercando di realizzare è scegliere la compressione delle immagini senza perdita o perdita a seconda del tipo di input. La perdita di un grande JPEG è una catastrofe di archiviazione.

I primi otto byte di un file PNG contengono sempre i seguenti valori: vedere Specifiche PNG :

(decimal) 137 80 78 71 13 10 26 10 (hexadecimal) 89 50 4e 47 0d 0a 1a 0a (ASCII C notation) \211 PNG \r \n \032 \n 

Quindi, se prendo 8 byte dall’inizio di qualsiasi file PNG e base64 lo codifico come segue, ottengo:

 head -c8 test.png | base64 iVBORw0KGgo= 

I primi 2 byte di ogni file JPEG contengono ff d8 in hex – vedi la voce di Wikipedia per JPEG . Quindi, se prendo un file JPEG e base64 codifico i primi due byte come segue, ottengo:

 head -c2 test.jpg | base64 /9g= 

Quindi il mio suggerimento sarebbe di guardare i primi (10 per PNG e 2 per JPEG , escludendo sempre i = ) caratteri del tuo file con codifica Base64 e vedere se corrispondono a quello che sto suggerendo e poi usarlo come determinante – be assicurati di inviare messaggi di errore se la tua stringa non corrisponde a nessuno nel caso in cui il test non sia sufficientemente accurato per qualche motivo!


Perché 10 caratteri per PNG? Perché la firma garantita è di 8 byte, cioè 64 bit e base64 divide in 6 bit alla volta per generare un carattere, quindi i primi 10 caratteri sono i primi 60 bit. L’undicesimo personaggio varierà in base a ciò che segue la firma.

La stessa logica per JPEG … 2 byte è 16 bit, il che significa che sono garantiti 2 caratteri ciascuno corrispondente a 6 bit. Il terzo carattere varierà in base a ciò che segue il marcatore SOI a 2 byte.