【问题标题】:Read EXIF-Thumbnail from JPEG从 JPEG 中读取 EXIF 缩略图
【发布时间】:2014-09-06 22:48:03
【问题描述】:

我需要一种高效的方法来从 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;
    }
}

【问题讨论】:

  • libexif 在原生代码中处理 exif 非常棒。
  • JPEG 标准比您的代码可以处理的要复杂一些。有一些标有大小的“块”。块可以是评论、EXIF、缩略图或其他内容。块用大小标记。缩略图数据可以有不同的格式,并且是完全可选的。
  • 好的,很高兴知道 - 我只是想在没有太多开销的情况下进行这样的短片,它适用于我的尼康图像。
  • @David Crowell - 我更新了其他格式的代码以及不存在的情况

标签: c# image jpeg exif .net


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 2010-11-22
    • 1970-01-01
    • 2010-11-22
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多