2012-05-14 42 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

それは私と一緒にこの方法を働いた:

  • クライアントがAスクリーンショットを受信したい場合は、あなたが開始を転送する前に画像のサイズを知っておく必要があります。
    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サービスです。スクリーンショットを取得して、その行を 'bitmap.Save(ms、System.Drawing.Imaging.ImageFormat.Jpeg);に変更した場合は正常に送信できますが、ImageFormatがPngの場合はそのエラーが発生します。 –

+0

'using'ブロックからすべてを移動してみてください。ストリームが早すぎると問題が発生するようです。最終的には、あなたが 'ms'で何をしたいかによって決まります。この種の分離コードは常に困難です。 – yamen

0

私はImage.Save(Stream, ImageCodecInfo, EncoderParameters)を使用していたと明らかにこれは悪名高いA generic error occurred in GDI+エラーが発生していました。

私はEncoderParameterを使用して100%の品質でjpegを保存しようとしていました。これは完全に "私のマシン"(doh!)で、生産ではなく動作していました。

代わりにImage.Save(Stream, ImageFormat)を使用した場合、エラーは表示されませんでした。だから、馬鹿のように私は後者を使い続けましたが、デフォルトの品質でそれらを保存しますが、私はそれがわずか50%であると想定しています。

この情報は誰かを助けてくれるでしょうか。

0

私はこれは古い記事ですけど、私は私のような誰かが将来的にこの問題横切る場合には、同様にこの情報を追加したい。..

私は.PNG画像を保存することができませんでしたそれはIIS App Pool Accountがこれにアクセスできないためです。あなたはPNG形式のグラフィックスを使用する際に必要とされる

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

-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'は' //ここで失敗します。失敗しました。 –

関連する問題