从ByteString中识别光栅图像(jpg、png等)或svg文件格式

3
在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个回答

5

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] == '<';

你的解决方案很有趣。但是,你真的确定光栅图像格式不以'<'开头吗? PS:"<?xml"还是"<?xml?"? - rPulvi
1
是的,我知道的(并且被WPF支持的)所有这些都以其他字符开头。 - Clemens
好的。无论如何,标识XML文档的XML标记应为"<?xml"。您能将此更正应用于您的答案中,以便我可以将其标记为正确吗? - rPulvi

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();

我之前不知道BitmapDecoder...CodecInfo,真的很有趣。但是如果我尝试从非图像源解码,就会抛出异常。也许Clemens的方法更好,因为我可以避免可能会减慢应用程序流程的异常。 - rPulvi
很明显,如果您尝试解码非图像源,那将会导致异常。正确的做法是识别图像类型。 - pushpraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接