如何使用标题字节

时间:2016-02-27 18:36:14

标签: c# image encoding gdi

所以我使用的是c#,我需要确定图像文件的实际编码。大多数图像可以采用一种格式,同时具有不同的扩展名,并且仍然可以正常工作。

我的需要需要精确的图像格式知识。

还有另一个线程处理此问题:Determine Image Encoding of Image File

此节目是在获得图像的标题信息后如何查找实际编码。 我需要打开图片并提取此标题信息。

FileStream imageFile = new FileStream("myImage.gif", FileMode.Open);

在此位之后,如何打开包含标题的字节?

谢谢。

2 个答案:

答案 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