2012-02-23 6 views
0

ワイドスクリーンモニタを持っていて、C#でwin APIを使ってスクリーン画像をキャプチャすると、キャプチャされた画像が広くなります。しかし、私は通常のアスペクト比1:1の画像を撮りたいです。 最初に画像を撮りたいのではなく、画像上のアイテムが不正な形になるため、サイズを変更する必要はありません。普通のアスペクト比のスクリーン画像をCでキャプチャする方法#

どうすればいいですか?これは可能ですか?

私はこのコードを使用しています:

public static Bitmap GetDesktopImage() 
    { 
     //In size variable we shall keep the size of the screen. 

     SIZE size; 


     IntPtr hDC = PlatformInvokeUSER32.GetDC(PlatformInvokeUSER32.GetDesktopWindow()); 


     IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC); 


     do{ 
     size.cx = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CXSCREEN); 

     size.cy = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CYSCREEN); 



      m_HBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy); 

     } while (m_HBitmap == IntPtr.Zero); 
     if (m_HBitmap!=IntPtr.Zero) 
     { 
      IntPtr hOld = (IntPtr) PlatformInvokeGDI32.SelectObject(hMemDC, m_HBitmap); 

      PlatformInvokeGDI32.BitBlt(hMemDC,0, 0,size.cx,size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY); 
      PlatformInvokeGDI32.SelectObject(hMemDC, hOld); 
      PlatformInvokeGDI32.DeleteDC(hMemDC); 
      PlatformInvokeUSER32.ReleaseDC(PlatformInvokeUSER32.GetDesktopWindow(), hDC); 
      Bitmap res=System.Drawing.Image.FromHbitmap(m_HBitmap); 
      PlatformInvokeGDI32.DeleteObject(m_HBitmap); 
      return res; 

     } 

     return null; 
    } 

答えて

0

あなたは、画面の一部をトリミングする必要があります。クロップすることなく16:9を4:3に変換することはできません。

-OR-

変更〜4の画面解像度:3の解像度は、 は、スクリーンショットを取り、戻ってそれを変更し 。

+0

解像度を4:3に変更すると時間がかかるでしょうか?私は毎秒頻繁に画面をキャプチャしたい。 –

+0

はい、変更の解像度は恐ろしい考えですので、4:3の次元にクロップする必要があります。スケーリングを避けたい場合は、これは唯一のオプションです。 –

0

サイズを取得するには、デスクトップのウィンドウハンドルでGetWindowRectを呼び出します。私はあなたが使用するGetSystemMetric呼び出しは、メニューバーなどを考慮するとは思わない。

+0

私はそれをテストした、それは画面全体を取る。 –

関連する問題