2014-07-08 147 views
0

我需要將圖像保存爲PNG格式。不幸的是舊設備(採用WinCE 5.0)圖像只能保存爲BMP格式:檢查設備是否支持以JPEG和PNG格式保存

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

我還沒有做過任何研究,但我會打賭答案涉及使用P/Invoke訪問GDI以獲取支持的編解碼器列表。 Guven這將需要更多的努力,我認爲你使用try/catch更好。 – Dai

+1

ImageCodecInfo類在CF上不可用。使用Environment.OSVersion跳轉到頭腦中。 –

+0

我會反思,並檢查System.Drawing.Imaging中是否存在屬性ImageFormat.Bmp。以下是使用反射檢查屬性的問題/答案:http://stackoverflow.com/questions/15341028/check-if-a-property-exist-in-a-class – josef

回答

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 
    } 
相關問題