2014-10-17 167 views
1

簡單的問題,我根本無法找到一個體面的答案。Image.Save需要額外的參數

我試圖內存圖像轉換爲字節數組,以便將其上傳爲Base64String

Bitmap CapSc() 
{ 
    using(Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height)) 
    { 
     using(Graphics g = Graphics.FromImage(bitmap)) 
     { 
     g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size); 
     } 
     return bitmap; 
    } 
} 

Image toUpload; 
toUpload = (Image)CapSc(); 

public static byte[] GetBytesFromImage(Image img) 
    { 
     if (img == null) return null; 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      img.Save(stream, img.RawFormat); 
      return stream.ToArray(); 
     } 
    } 

GetBytesFromImage(toUpload); 

但是「img.Save」不斷返回錯誤的地方似乎需要第三paramater的EncoderParamaters,沒有示例代碼或MSDN上的開發人員解決方案說這是必要的,但它不斷返回錯誤,如果我有它存在與否。

具體錯誤是'參數不能爲空。 Paramater name:encoder'

任何幫助將不勝感激。

+1

什麼'Image'類型是什麼?在不同的框架中有各種不同的... – 2014-10-17 14:59:02

+0

System.Drawing.Image,最初返回爲位圖和轉換。 – ConnorLSW 2014-10-17 15:00:53

+0

[C#Image to Byte \ [\] and Byte \ [\] to Image]的可能重複(http://stackoverflow.com/questions/8764280/c-sharp-image-to-byte-and-byte-to -image) – 2014-10-17 15:01:06

回答

1

內,您的通話Image.Save(如果你不指定編碼器)的,該框架是使這一呼籲:

ImageCodecInfo encoder = format.FindEncoder(); 

,然後將該結果傳遞到,它指定一個編碼器過載。

發生什麼事是FindEncoder返回null在你的情況。因此係統找不到編碼器,該編碼器適用於由RawFormat屬性指定的任何ImageFormat

要查看編解碼器可在機器上,你可以通過

ImageCodeInfo.GetImageEncoders() 

結果迭代或者你可以只與你認識一個走的是有沒有像JPEG :)

+0

'RawFormat'是'ImageFormat'類型的屬性,不是實際的格式。問題是,無論它是什麼格式,它都找不到它的編碼器。 – Plutonix 2014-10-17 15:26:04

+0

這就是我的意思,但看看我寫的東西並不明顯。感謝您指出。 – Tim 2014-10-17 15:29:31

0

這是相當這正是我過去一個月來一直在努力的。提供我沒有錯過任何東西,這應該工作(可能需要額外的using陳述或兩個):

ImageCodecInfo codec; 
EncoderParameters myEPS; 

public YourConstructor() { 

    codec = GetEncoder(ImageFormat.Jpeg); 
    myEPS = new EncoderParameters(1); 
    System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality; 
    EncoderParameter myEP = new EncoderParameter(myEncoder, 60L); // 0-100 quality level 
    myEPS.Param[0] = myEP; 

} 

private ImageCodecInfo GetEncoder(ImageFormat format) 
{ 
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 

    foreach (ImageCodecInfo codec in codecs) 
    { 
     if (codec.FormatID == format.Guid) 
     { 
      return codec; 
     } 
    } 
    return null; 
} 

public static byte[] GetBytesFromImage(Image img) 
{ 
    if (img == null) return null; 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     img.Save(stream, codec, myEPS); 
     return stream.ToArray(); 
    } 
}