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;
}
}
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 .