从ByteString中识别Raster(jpg,png等)或svg文件格式

时间:2014-07-16 07:15:51

标签: c# wpf svg

在C#(.NET FW 4.5)中,有没有办法了解bytestring是否包含.svg文件或任何光栅文件?我用这个例程:

[...]
byte[] img = System.Convert.FromBase64String(res);
ctrlImage = new BitmapImage();
ctrlImage.BeginInit();
MemoryStream ms = new MemoryStream(img);                                        
ctrlImage.StreamSource = ms;
ctrlImage.EndInit();

将流转换为BitmpatImage,但现在我需要验证res是否包含svg文件而不是光栅文件。

谢谢。

2 个答案:

答案 0 :(得分:3)

SVG文件格式基于XML。因此,您可以尝试解码图像缓冲区中的文本字符串,并检查它是以<?xml还是<svg开头:

bool isSvg = false;

try
{
    var text = Encoding.UTF8.GetString(img);
    isSvg = text.StartsWith("<?xml ") || text.StartsWith("<svg ");
}
catch
{
}

或者您可能只是检查缓冲区中的第一个字节是否为<,因为栅格图像格式不是以该字符开头的:

bool isSvg = img[0] == '<';

答案 1 :(得分:0)

成功创建解码器后,您可以使用BitmapDecoder类并阅读CodecInfo

样品

    FileStream stream = new FileStream(imagePath, FileMode.Open);
    BitmapDecoder decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
    // decoder.CodecInfo contains the information about the image type
    stream.Close();

example

你的案子

    byte[] img = System.Convert.FromBase64String(res);
    MemoryStream ms = new MemoryStream(img);  
    BitmapDecoder decoder = BitmapDecoder.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.None);
    // decoder.CodecInfo contains the information about the image type
    stream.Close();