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 Interface(Reference 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
}
我還沒有做過任何研究,但我會打賭答案涉及使用P/Invoke訪問GDI以獲取支持的編解碼器列表。 Guven這將需要更多的努力,我認爲你使用try/catch更好。 – Dai
ImageCodecInfo類在CF上不可用。使用Environment.OSVersion跳轉到頭腦中。 –
我會反思,並檢查System.Drawing.Imaging中是否存在屬性ImageFormat.Bmp。以下是使用反射檢查屬性的問題/答案:http://stackoverflow.com/questions/15341028/check-if-a-property-exist-in-a-class – josef