所以我使用的是c#,我需要确定图像文件的实际编码。大多数图像可以采用一种格式,同时具有不同的扩展名,并且仍然可以正常工作。
我的需要需要精确的图像格式知识。
还有另一个线程处理此问题:Determine Image Encoding of Image File
此节目是在获得图像的标题信息后如何查找实际编码。 我需要打开图片并提取此标题信息。
FileStream imageFile = new FileStream("myImage.gif", FileMode.Open);
在此位之后,如何打开仅包含标题的字节?
谢谢。
答案 0 :(得分:0)
除非你知道它的大小,否则你不能真正阅读“只是标题”。
相反,确定您需要能够区分需要支持的格式的最小字节数,并且只读取这些字节。最有可能您需要的所有格式都有一个唯一的标题。
例如,如果你需要支持png& jpeg,这些格式以:
开头 PNG: 89 50 4E 47 0D 0A 1A 0A
JPEG: FF D8 FF E0
因此,在这种情况下,您只需读取两个字节就可以有所不同。实际上我会说使用几个字节,以防你遇到其他文件格式。
从文件开头读取,比方说8个字节:
using( var sr = new FileStream( "file", FileMode.Open ) )
{
var data = new byte[8];
int numRead = sr.Read( data, 0, data.Length );
// numRead gives you the number of bytes read
}
答案 1 :(得分:-1)
我最终弄清楚了。所以我要更新线程并关闭它。我的解决方案唯一的问题是它需要打开整个图像文件,而不仅仅是打开所需的字节。 这使用了更多的内存,并且需要更长的时间。因此,当速度成为问题时,它不是最佳解决方案。
只是为了给予应有的信用,这段代码是从a创建的 这里有几个来源堆栈溢出,你可以找到链接 OP和早先的评论。其余的代码是由我写的。
如果有人想修改代码只打开正确的字节数,请随意。
TextWriterTraceListener writer = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(writer);
// PNG file contains 8 - bytes header.
// JPEG file contains 2 - bytes header(SOI) followed by series of markers,
// some markers can be followed by data array. Each type of marker has different header format.
// The bytes where the image is stored follows SOF0 marker(10 - bytes length).
// However, between JPEG header and SOF0 marker there can be other segments.
// BMP file contains 14 - bytes header.
// GIF file contains at least 14 bytes in its header.
FileStream memStream = new FileStream(@"C:\\a.png", FileMode.Open);
Image fileImage = Image.FromStream(memStream);
//get image format
var fileImageFormat = typeof(System.Drawing.Imaging.ImageFormat).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static).ToList().ConvertAll(property => property.GetValue(null, null)).Single(image_format => image_format.Equals(fileImage.RawFormat));
MessageBox.Show("File Format: " + fileImageFormat);
//get image codec
var fileImageFormatCodec = System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders().ToList().Single(image_codec => image_codec.FormatID == fileImage.RawFormat.Guid);
MessageBox.Show("MimeType: " + fileImageFormatCodec.MimeType + " \n" + "Extension: " + fileImageFormatCodec.FilenameExtension + "\n" + "Actual Codec: " + fileImageFormatCodec.CodecName);
输出符合预期:
file_image_format:Png
内置PNG编解码器,mime:image / png,扩展名:* .PNG