我需要一种高性能的方法来从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;
}
}
答案 0 :(得分:2)
整个JPEG文件位于FFD8 - FFD9字节内,而不仅仅是缩略图,因此您获得的代码将复制整个文件。如果你检查image.jpg和thumbnail.jpg的确切大小,你应该看到这个。
但是,由于Image.Clear
您丢失了第一个字节,然后break
导致您丢失了最后一个字节。
您需要根据JPEG结构实际解析文件,以便可靠地提取缩略图。我还没有使用它,但您可能会发现采用existing library更容易。