1

Windows でスクリーンショットを作成しLockBits、GDI+ の関数を使用してピクセル データを抽出し、ファイルに書き込みます。

パフォーマンスを最大化するために、私は次のことも行っています。

  • PixelFormatフォーマット変換を避けるために、ソース ビットマップと同じものを使用する
  • フラグを使用しImageLockModeUserInputBufてピクセル データを事前に割り当てられたバッファに抽出する
  • この事前に割り当てられたバッファ ( が指すBitmapData::Scan0) は、メモリ マップト ファイルの一部です (ピクセル データの再コピーを避けるため)。

また、ファイルを読み取るコードを作成するので、任意の形式を使用 (または作成) できます。ただし、既存のプログラム (理想的には Web ブラウザー) が読み取ることができるよく知られた形式を使用することをお勧めします。これは、他のプログラム (画像を読み取るプログラム) のコードを記述する前に、画像が正しいことを視覚的に確認できるためです。 )

PixelFormat32bppRGB32bpp BMP ファイルの形式に一致する形式でこれを正常に実装したので、ピクセル データを直接メモリ マップされた BMP ファイルに抽出し、プレフィックスとして BMP ヘッダーを付けると、有効な BMP イメージ ファイルを取得できます。ペイントおよびほとんどのブラウザで開くことができます。

残念ながら、私がテストしているマシンの 1 つは、PixelFormat64bppPARGBフォーマットでピクセルを返します (おそらく、これはビデオ アダプター ドライバーの影響を受けます)。これに対応する BMP ピクセル フォーマットはありません。

16、24、または 32bpp の BMP 形式に変換すると、プログラムの速度が大幅に低下する (損失が大きくなる) ため、このピクセル形式を変換せずに使用できるファイル形式を探しているので、メモリマップ ファイルに直接抽出できます。私が 32bpp フォーマットで行ったように。

48bpp (BGR オーダー、リトル エンディアン) および/または 64bpp (BGRA オーダー、リトル エンディアン) をサポートするラスター イメージ ファイル形式は?


編集

これまでのところ、これらの形式を除外しました。

  • BMP : 深度は <=32bpp に制限されます (それ以外の場合は完全に一致します)。
  • PNG : サンプルの順序は RGBA のみです。
  • TIFF : サンプルの順序は RGBA のみです。

考えられる部分的な解決策:

  • OpenEXR : 48bpp のみ。サンプルの順序はチャンネル名のアルファベット順です。BGR は適合しますが、BGRA は適合しません。
4

6 に答える 6

3

標準形式が必要な唯一の理由は、表示/テスト目的のためのようです。したがって、独自の形式をロールバックしますが、表示用に PNG または TIFF に変換します。そして次に進みましょう... 人生は短いです。

于 2010-04-05T03:01:50.353 に答える
2

本当に 14 の異なる PixelFormats ごとに別々のリーダーを実装して慎重にテストしたいですか? これまでのところ、そのうちの 2 つしか見たことがないことはわかっていますが、他の 12 のほぼすべてを備えたビデオ カードが世の中にあることは保証します。1 つの簡単な例として、モニターを 256 色に設定します...

あなたはパフォーマンスを最大化したいと言いますが、ビットマップをディスク上のファイルに書き込むには、メモリ マッピングを使用しても、デバイスに依存しないビットマップに変換するのにかかる時間よりも平均して時間がかかります。メモリー。さらに、64 ビット ビットマップを 32 ビット ビットマップに変換すると、結果のファイルの書き込み時間が半分になるため、実際には高速になる可能性があります。

于 2010-03-26T16:36:28.320 に答える
1

デスクトップや Web のファイル形式にがっかりした場合は、大砲に手を伸ばすことを考えてみてください: FITS (柔軟な画像転送システム) やHDF5、さらにはDICOMなどです。

于 2010-04-05T08:14:52.173 に答える
1

どのビットマップの色深度がサポートされているかは、グラフィックス アダプターではなく、Windows のバージョン (gdi+ のバージョン) によって異なります。

TIFF または PNG を使用することもできます (png には多くのパラメーターがあります。圧縮しないように指示することもできると思います)。RAW形式も検討できます。

.net ラッパーが含まれているイメージング ライブラリ imagemagick は、何百もの画像フォーマットをサポートしています。

于 2010-03-26T16:23:47.423 に答える
0

PNG? 48 ビット + アルファ = 64 ビット

圧縮については、「圧縮されていない deflate ブロックのみを使用することで、圧縮されていないデータを格納できます」

于 2010-03-26T16:22:53.260 に答える
0

ファイルの読み取りは、書き込みと同じくらいパフォーマンスが重要ですか? バッファを簡単に埋めることができ、都合の良いときに読むことができれば、これは簡単なことです。データ形式を表す 1 バイトのヘッダーと、取得した生データを用意するだけです。

于 2010-03-30T12:41:51.337 に答える