图片文件头以及解码
1.JPEG
- 文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识)
- 文件结束标识 (2 bytes): 0xff, 0xd9 (EOI)
2.TGA
- 未压缩的前5字节 00 00 02 00 00
- RLE压缩的前5字节 00 00 10 00 00
3.PNG
- 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A
4.GIF
- 文件头标识 (6 bytes) 47 49 46 38 39(37) 61
G I F 8 9 (7) a
5.BMP
- 文件头标识 (2 bytes) 42 4D
B M
6.PCX
- 文件头标识 (1 bytes) 0A
7.TIFF
- 文件头标识 (2 bytes) 4D 4D 或 49 49
8.ICO
- 文件头标识 (8 bytes) 00 00 01 00 01 00 20 20
9.CUR
- 文件头标识 (8 bytes) 00 00 02 00 01 00 20 20
10.IFF
- 文件头标识 (4 bytes) 46 4F 52 4D
F O R M
11.ANI
- 文件头标识 (4 bytes) 52 49 46 46
以下是C#解码示例,只示范了几种常见的
using System.IO;
using System.Drawing; //引用添加程序集 System.Drawing
// 调用方法: System.Windows.Controls.Image.Source = GetSourceData(imagesource);
// 调用方法: BitmapSource bmpsou = GetSourceData(imagesource);
public static BitmapSource GetSourceData(MemoryStream Source)
{
BitmapSource Mapsou = null;
byte[] buff = Source.ToArray();
try
{
switch (buff[0])
{
case 0xff: //Jpeg格式
{
if (buff[1] == 0xd8)
{
Mapsou = new JpegBitmapDecoder(Source, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default).Frames[0];
}
} break;
case 0x89: //Png格式
{
if (buff[1] == 0x50 && buff[2] == 0x4E && buff[7] == 0x0A)
{
Mapsou = new PngBitmapDecoder(Source, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default).Frames[0];
}
} break;
case 0x42: //Bmp格式
{
if (buff[1] == 0x4d)
{
Mapsou = new BmpBitmapDecoder(Source, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default).Frames[0];
} break;
}
case 0x47: //Gif格式 实现播放效果移步至 https://www.cnblogs.com/liunlls/p/wpf-gif.html
{
if (buff[1] == 0x49 && buff[5] == 0x61)
{
Mapsou = new GifBitmapDecoder(Source, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default).Frames[0];
}
}
break;
case 0x00: //Icon格式
{
if (buff[1] == 0x00 && buff[2] == 0x01)
{
Mapsou = new IconBitmapDecoder(Source, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default).Frames[0];
}
}
break;
default: throw new Exception("图片格式错误或不支持此类型图片数据!");
}
}
catch (Exception x)
{
MessageBox.Show(x.ToString());
}
return Mapsou;
}
部分资料来源(文件头):https://blog.csdn.net/include1224/article/details/5195470?utm_source=copy
上一篇: PHP+Resumablejs实现分片上传 断点续传
下一篇: 用java流方式判断文件类型
推荐阅读