检查设备是否支持以JPEG和PNG格式保存

时间:2014-07-08 10:44:05

标签: c# compact-framework windows-ce

我需要将图像保存为PNG格式。不幸的是,在旧设备上(使用WinCE 5.0),图像只能以BMP格式保存:

 try
 {
   destinationBmp.Save(fileName+".png", ImageFormat.Png);
 }
 catch (NotSupportedException)
 {
   // No PNG & JPG support on Windows CE 5.0 devices
   //
   destinationBmp.Save(fileName+".bmp", ImageFormat.Bmp);
}
finally
{
    destinationBmp.Dispose();
}

是否可以在不处理NotSupportedException的情况下检查图像格式支持?

1 个答案:

答案 0 :(得分:3)

Windows CE 5.0能够支持JPEG和PNG编码,但这取决于设备供应商如何配置操作系统映像。如果他们没有包含编解码器,那么它将无法工作。如果您是创建Windows映像的供应商,则可以使用平台构建器将这些映像添加到设备中。

您正在使用的方法可能是决定它是否能够保存PNG或JPG图像的最简单方法。但是,在一般意义上,假设如果它不支持PNG它也不支持JPG(查看你的try / catch代码,你需要一个try / catch来表示每种格式),这是正确的。

如果您了解代码运行的所有可能设备,那么使用@HansPassant建议检查Environment.OSVersion可能是合理的,您可能认为它是Win CE 5.0之一您知道的并不支持JPG和PNG的设备。否则,假设Windows CE 5.0不支持是不正确的。

如果您想要确定安装哪些编解码器的确切方法,您可以通过与Imaging COM InterfaceReference Here)进行交互来找到该解决方案。具体来说,您似乎需要拨打IImagingFactory.GetInstalledEncoders

我的建议可能是保持简单并创建测试图像并尝试将其以每种格式保存到MemoryStream一次,并捕获NotSupportedExceptions以确定设备的功能。这样您就不需要创建文件了。

注意:

COM导入看起来像这样但是你需要用正确的参数填写你想要的GetInstallEncoders方法的占位符(抱歉我没有使用它)。然后调用Activator.CreateInstance(...)您需要熟悉与.NET中的COM接口交互。

    [ComImport, Guid("327ABDA7-072B-11D3-9D7B-0000F81EF32E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComVisible(true)]
    public interface IImagingFactory
    {
        uint CreateImageFromStream();       // This is a place holder, note the lack of arguments
        uint CreateImageFromFile(string filename, out IImage image);
        // We need the MarshalAs attribute here to keep COM interop from sending the buffer down as a Safe Array.
        uint CreateImageFromBuffer([MarshalAs(UnmanagedType.LPArray)] byte[] buffer, uint size, BufferDisposalFlag disposalFlag, out IImage image);
        uint CreateNewBitmap(uint width, uint height, PixelFormatID pixelFormat, out IBitmapImage bitmap);
        uint CreateBitmapFromImage(IImage image, uint width, uint height, PixelFormatID pixelFormat, InterpolationHint hints, out IBitmapImage bitmap);
        uint CreateBitmapFromBuffer();      // This is a place holder, note the lack of arguments
        uint CreateImageDecoder();          // This is a place holder, note the lack of arguments
        uint CreateImageEncoderToStream();  // This is a place holder, note the lack of arguments
        uint CreateImageEncoderToFile();    // This is a place holder, note the lack of arguments
        uint GetInstalledDecoders();        // This is a place holder, note the lack of arguments
        uint GetInstalledEncoders();        // This is a place holder, note the lack of arguments
        uint InstallImageCodec();           // This is a place holder, note the lack of arguments
        uint UninstallImageCodec();         // This is a place holder, note the lack of arguments
    }