2016-07-26 73 views
0

我有一個Web API,它從文件夾中獲取圖像(可以是jpeg或png),並將其轉換爲字節數組併發送到調用應用程序。限制圖像字節數組轉換爲PNG格式

我用下面的函數將圖像轉換爲二進制:

public static byte[] ImageToBinary(string imagePath) 
{ 
    FileStream fS = new FileStream(imagePath, FileMode.Open, FileAccess.Read); 
    byte[] b = new byte[fS.Length]; 
    fS.Read(b, 0, (int)fS.Length); 
    fS.Close(); 
    return b; 
} 

及以下「數據」將被傳遞到Web API響應。

byte[] data = ImageToBinary(<PATH HERE>); 

我想要的僅限於在調用此Web API的應用程序中將此數據轉換爲PNG格式。

目的是我不希望每次都提醒其他開發人員編寫其他應用程序,只需將其轉換爲PNG即可。

回答

0

一個PNG總是以0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A字節開頭。

因此,您可以檢查文件的第一個字節和擴展名。

在API上,您應該評論您的代碼並使用好的方法名稱來防止錯誤。您可以從ImageToBinaryPngImageToBinary改變你的方法名稱...

public static readonly byte[] PngSignature = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; 
/// <summary> 
/// Convert a PNG from file path to byte array. 
/// </summary> 
/// <param name="imagePath">A relative or absolute path for the png file that need to be convert to byte array.</param> 
/// <returns>A byte array representation on the png file.</returns> 
public static byte[] PngImageToBinary(string imagePath) 
{ 
    if (!File.Exists(imagePath)) // Check file exist 
     throw new FileNotFoundException("File not found", imagePath); 
    if (Path.GetExtension(imagePath)?.ToLower() != ".png") // Check file extension 
     throw new ArgumentOutOfRangeException(imagePath, "Requiere a png extension"); 
    // Read stream 
    byte[] b; 
    using (var fS = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) 
    { 
     b = new byte[fS.Length]; 
     fS.Read(b, 0, (int)fS.Length); 
     fS.Close(); 
    } 
    // Check first bytes of file, a png start with "PngSignature" bytes 
    if (b == null 
     || b.Length < PngSignature.Length 
     || PngSignature.Where((t, i) => b[i] != t).Any()) 
     throw new IOException($"{imagePath} is corrupted"); 

    return b; 
} 
+0

ImageToBinary功能在Web API中用來生成將發送到其它應用程序中的byte [],所以我一直在尋找一種方法,我可以確保在其他應用程序中收到字節[]時,不能將其轉換爲任何其他格式,只能使用PNG格式。 – Dineesh

相關問題