【发布时间】: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 - 我更新了其他格式的代码以及不存在的情况