2012-05-14 43 views
3

時,我有一個服務器 - 客戶端應用程序,我想從服務器獲取一個屏幕截圖,但上線
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
我得到這個異常:A generic error occurred in GDI+.Image.Save異常「GDI +中發生了一般性錯誤」。保存到的MemoryStream

private Socket ScreenSocket; 
    private MemoryStream ms; 
    public void ConnectScreenShot(IPEndPoint ep) 
    { 
     if (ScreenSocket != null) 
     { 
      ScreenSocket.Dispose(); 
      ScreenSocket = null; 
     } 
     if (ms != null) 
     { 
      ms.Dispose(); 
      ms = null; 
     } 
     ScreenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     ScreenSocket.Connect(ep); 
     ms = new MemoryStream(); 
     Rectangle bounds = Screen.GetBounds(Point.Empty); 
     using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height)) 
     { 
      using (Graphics g = Graphics.FromImage(bitmap)) 
      { 
       g.CopyFromScreen(Point.Empty, Point.Empty, bitmap.Size); 
      } 
      bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
     } 
    } 

這是爲什麼發生的事情,以及如何我會修復它嗎?

更新:它的工作原理,當我使用ImageFormat.Jpeg相反的ImageFormat.Png,但我仍然需要一個PNG格式。

+0

不確定這是否有幫助。但是,你能不能在你的'CopyFromScreen'後面傳回Graphics對象?或者你的方法必須是無效的?或者實際上也許只是你的Bitmap對象。 – meanbunny

+0

@meanbunny我不知道如果我有你的觀點,但CopyFromScreen不是我的方法,它的Graphics.CopyFromScreen方法! –

+0

正確的我想我的觀點是你打算如何將你的位圖傳回給你的客戶,如果這是你的意圖。無論這裏是一個可以幫助你的帖子。 http://forums.asp.net/t/1766006.aspx/1 – meanbunny

回答

0

它與我的工作是這樣的:

  • 當客戶想要接收的截圖,你需要傳遞開始前就知道圖像尺寸。
    致電GetScreenShotSize()以獲取圖像的大小。

  • 一旦你得到的大小,請致電GetScreenShot()接收圖像數據。

我用using (MemoryStream ms = new MemoryStream())所以現在PNG格式工作。

private Image img = null; 
    public long GetScreenShotSize() 
    { 
     Rectangle bounds = Screen.GetBounds(Point.Empty); 
     using (Bitmap bmp = new Bitmap(bounds.Width, bounds.Height)) 
     { 
      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size); 
      } 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
       img = Image.FromStream(ms); 
       return ms.Length; 
      } 
     } 
    } 
    public void GetScreenShot(IPEndPoint ep) 
    { 
     using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
     { 
      socket.Connect(ep); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
       socket.Send(ms.ToArray(), SocketFlags.None); 
      } 
      img.Dispose(); 
      img = null; 
     } 
    } 
1

你說:

我想從服務器獲取屏幕截圖

和錯誤是GDI +的相關建議,根據此代碼正在運行的情況下可能是一個服務上下文(如IIS),而不是桌面。那是對的嗎?如果是這樣,你期望在截圖中返回什麼?

爲了記錄在案,下面的(最小的)的代碼工作正常:

var ms = new MemoryStream(); 
    Rectangle bounds = Screen.GetBounds(Point.Empty); 
    using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height)) 
    { 
     using (Graphics g = Graphics.FromImage(bitmap)) 
     { 
      g.CopyFromScreen(Point.Empty, Point.Empty, bitmap.Size); 
     } 
     bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
    } 

兩個bitmapms包含預期的數據。因此,我認爲您需要提供有關此代碼在何處以及在何處運行的信息。

+0

這是一個WCF服務,我可以得到一個ScreenShot併發送它,如果我將該行更改爲'bitmap.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);'但是當ImageFormat是Png我得到該錯誤。 –

+0

嘗試移動「使用」塊中的所有內容。似乎有關於過早關閉流的問題。最終,這取決於你想用'ms'做什麼。這種孤立的代碼總是很困難。 – yamen

0

對我來說,我用的是Image.Save(Stream, ImageCodecInfo, EncoderParameters),顯然這是造成臭名昭著A generic error occurred in GDI+錯誤。

我試圖使用EncoderParameter以100%的質量保存jpegs。這是完美的「我的機器」(doh!),而不是生產。

當我用Image.Save(Stream, ImageFormat)代替時,錯誤消失了!所以就像一個白癡,我繼續使用後者,儘管它保存在默認質量,我認爲只是50%。

希望此信息有助於某人。

0

我知道這是舊的文章,但我想添加此信息爲好,萬一有人像我碰到這個問題在未來的運行..

我無法保存。PNG圖像這是因爲IIS應用程序池帳戶無權訪問此密鑰。

HKEY_CLASSES_ROOT \ CLSID {FAE3D380-FEA4-4623-8C75-C6B61110B681}

當您使用PNG圖形這是必需的。

-2
abrirConexion(); 
cmd = new SqlCommand(" INSERT INTO [SICRE_BI].[Credito_CCSS].[bi_img](Descripcion,img) VALUES (@nom_img,@img)",cn);         
cmd.Parameters.Add("@Descripcion", SqlDbType.NChar); 
cmd.Parameters.Add("@img", SqlDbType.Image); 

cmd.Parameters["@Descripcion"].Value = descripcion; 

System.IO.MemoryStream ms = new System.IO.MemoryStream(); 

pbImagen.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);//Aqui se me cae.Aqui se me cae.Aqui . 

cmd.Parameters["@img"].Value = ms.GetBuffer(); //ms.GetBuffer(); 

cmd.ExecuteNonQuery(); 
return true; 
+1

你能翻譯你的評論和函數名嗎? –

+1

雖然這個答案可能是正確和有用的,但是如果你包含一些解釋並解釋它如何幫助解決這個問題,那麼這是首選。如果存在導致其停止工作並且用戶需要了解其曾經工作的變化(可能不相關),這在未來變得特別有用。 –

+0

@PaulTomkiel'// Aqui se me cae.Aqui se me cae.Aqui''意思是'//這裏失敗了,它失敗了。這裏有' –

相關問題