スクリーンショットはどのように機能しますか?



How Does Screenshotting Work



解決:

しかし、スクリーンショット自体は、データがピクセルに変換される前に発生すると思いますか?

データが変換される前に発生します 物理的 ピクセル(ある場合)、ただしデータが変換された後に発生します ピクセル値 、つまりビットマップ画像。



たとえば、プログラムがテキスト、ベクターグラフィック、または3Dビジュアルを表示している場合、スクリーンショットプロセスはそれをまったく気にせず、それらのグラフィックがビットマップにレンダリングされた後の結果の画像のみを気にします。

ただし、スクリーンショットはOSメモリから直接取得されるか、最悪の場合、GPUメモリから読み取られます。 いいえ 実際のVGAまたはHDMI信号からキャプチャされます。



言い換えれば、スクリーンショットはどのように機能しますか?ピクセルを「フリーズ」しますか?動作するのはグラフィックカードまたはそのドライバですか?他のハードウェアまたはソフトウェアコンポーネント?

あなたが尋ねているOSに依存します。一般に、コアグラフィックシステム(WindowsのGDIやLinuxのX11など、アプリがウィンドウを画面に表示できるのと同じシステム)は、画面上のすべてのピクセル(つまり、フレームバッファー)のメモリ内コピーを保持します。必要なときにいつでもGPUに再度送信されます。したがって、プログラムがそのコピーを取得するための関数を提供するだけです。

たとえば、Windowsには、GetDC()関数とGetWindowDC()関数があります。 Linuxでは、X11システムにはXGetImage()などの似たようなメソッドがあります。これらは、特別なハードウェアの関与なしに、システムRAMのどこかにすでに保持されているビットマップイメージをプログラムに提供するだけです。



(Linux上のGNOMEなどの場合もありますが、ウィンドウマネージャーは実際にはGPUを使用して画面のコンテンツを構成します。したがって、スクリーンショットを作成するには、最初にデータをCPUに要求する必要があります。)


補足として、フレームバッファにあるものと実際に表示されているものとの間にはいくつかの違いがある可能性があります。たとえば、多くのビデオゲームは、GPUを使用しているため、非常に暗いスクリーンショットを生成します。 ガンマ補正 画像の明るさを調整する機能。この補正は、ビデオ信号を生成するときの最後のステップとしてのみ適用されるため、スクリーンショットは補正されていない暗い画像のみをキャプチャします。 (ゲームが実際にOSスクリーンショット機能全体を独自のものでオーバーライドしない限り。)


違いを確認する1つの方法は、2つの結果を検討することです。

スクリーンショットは、コンピューターがフルスクリーン画像をデジタル形式で取得してファイルとして保存するのと同じです。このように、デジタル情報は、モニターとディスプレイアダプターの機能に基づいて、可能な限り正確になります。 4K対応のカードとディスプレイをお持ちの場合、画面キャプチャは完全な詳細で4Kになります。

一方、画面のカメラスナップショットは、デジタルからアナログ、デジタルへの変換です。最初のデジタルは、ディスプレイアダプタからの前述の情報です。アナログ部分は、ディスプレイから目やカメラへの光の伝達であり、最終的なデジタルは、カメラのデジタルセンサーを介してその光をデジタルに変換することです。

スクリーンキャプチャと比較して、カメラによって提供される画像の品質には大きな違いがあります。このカメラは、光の形で「信号」を収差と損失のあるレンズに通すことにより、品質をさらに低下させます。


カメラは光センサーからデータを読み取り、そのデータをRAMまたはその他のストレージに保存します。静止画ではなくビデオカメラの場合、これを継続的に行っています。センサーからの「生の」データは、PCグラフィックカードやカメラのLCDなどのディスプレイデバイスに必要な形式と互換性がない可能性があるため、カメラを搭載したデバイスがカメラが見ているものを表示する必要がある場合は、カメラフォーマットからディスプレイデバイスフォーマットへの変換が必要です。

スクリーンショットは、ビデオカードで使用されているRAMにすでに存在するデータ、または最終的にはディスプレイデバイス宛てのデータのエクスポートです。通常、このデータは、PCグラフィックカードまたはその他のディスプレイデバイスが期待する形式です。キャプチャするときは、この形式からよく知られた画像形式に変換する必要があります。

したがって、主な違いはデータフローの1つです。

カメラ-> RAWデータ->ストレージまたはRAMへのキャプチャ(コピー)->ディスプレイデバイスバイナリフォーマット->ディスプレイデバイスビデオRAM->ディスプレイデバイス(カメラが見ているものを直接表示する必要がある場合)

カメラ-> RAWデータ->一時ストレージまたはRAMへのキャプチャ(コピー)->そこからJPEGなどへの変換(カメラが見ているものをファイルに保存する必要がある場合)

ディスプレイデバイス->ディスプレイデバイスのビデオRAM->ディスプレイデバイスのバイナリ形式->他のシステムRAMへのキャプチャ(コピー)->そこからBMP、JPEGなどへの変換(画像をファイルに生成するために使用しているディスプレイデバイスを保存する)