从JPEG读取EXIF-Thumbnail

时间:2014-07-16 11:59:22

标签: c# image jpeg exif .net

我需要一种高性能的方法来从jpg文件中提取缩略图而无需读取整个文件。

我写了这个方法,应该可以正常工作 - 但事实并非如此。无法读取新文件。我的错误在哪里?

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 个答案:

答案 0 :(得分:2)

整个JPEG文件位于FFD8 - FFD9字节内,而不仅仅是缩略图,因此您获得的代码将复制整个文件。如果你检查image.jpg和thumbnail.jpg的确切大小,你应该看到这个。

但是,由于Image.Clear您丢失了第一个字节,然后break导致您丢失了最后一个字节。

您需要根据JPEG结构实际解析文件,以便可靠地提取缩略图。我还没有使用它,但您可能会发现采用existing library更容易。