Lire la vignette EXIF de JPEG

j'ai besoin d'un moyen performant pour extraire une vignette d'un fichier jpg sans lire l'ensemble du fichier.

j'ai écrit cette méthode, qui devrait bien fonctionner - mais elle ne fonctionne pas. Le nouveau fichier ne peut pas être lu. Où est mon erreur?

public static System.Drawing.Image GetThumbnail(string Image)
{
    try
    {
        List<byte> image = new List<byte>();
        byte[] _startToken = new byte[2] { 0xFF, 0xD8 }; //JPEG Start
        byte[] _endToken = new byte[2] { 0xFF, 0xD9 }; //JPEG End
        byte[] buff = new byte[2];
        FileStream fs = new FileStream(Image, FileMode.Open, FileAccess.Read);
        BinaryReader br = new BinaryReader(fs);
        while (br.BaseStream.Position < br.BaseStream.Length)
        {
            byte bCurrent = br.ReadByte();
            buff[0] = buff[1];
            buff[1] = bCurrent;
            if (Enumerable.SequenceEqual(buff, _startToken))
            {
                image.Clear();
                image.AddRange(buff);
            };
            if (Enumerable.SequenceEqual(buff, _endToken))
            {
                break;
            };
            image.Add(bCurrent);
        }
        return (Bitmap)((new ImageConverter()).ConvertFrom(image.ToArray()));
    }
    catch
    {
        return null;
    }
}
2
demandé sur fubo 2014-07-16 15:59:21

1 réponses

L'ensemble du fichier JPEG se trouve à l'intérieur des octets FFD8 - FFD9, pas seulement la vignette de sorte que le code que vous avez là copierait l'ensemble du fichier. Si vous vérifiez les tailles exactes de l'image.jpg et miniature.jpg vous devriez voir ceci.

cependant, à cause du Image.Clear vous perdez le premier octet et ensuite le break vous fait perdre le dernier.

vous aurez besoin de réellement analyser le fichier selon la structure JPEG à fiable extrayez la vignette. Je ne l'ai pas utilisé mais vous pouvez trouver plus facile d'adopter un bibliothèque existante .

2
répondu Andy Jones 2014-08-21 13:47:00