Windowsのクリップボードからイメージを貼り付けるために、私のアプリケーション(RGBA8888イメージで動作)が必要です。だから、クリップボードから、Gimp、Photoshop、MSPaintなどの一般的なラスターイメージアプリから来た画像を読み取ることができるはずです。を呼び出すことができるようです。 WindowsはそれをCF_BITMAPとCF_DIBの間で自動的に変換するので、クリップボードにあるほとんどすべてのビットマップタイプにアクセスできます。しかし、DIBフォーマットを読み上げることで、ビット深度、RGBオーダー、オプションの圧縮などの組み合わせが膨大な数であることがわかります。私がやっていることはよくあることですが、 Windows APIの変換関数を見ることはできません(検索に貧弱な場合を除きます)、これは可能なすべての形式をサポートするために1週間かかると思われます。だから明らかに何かを見落としてしまったのかなと思います。あるいは、私がこれを単純化するために行うことができる何らかの仮定がある場合...一般的な画像アプリケーションのすべてが非圧縮/非インデックス形式で画像をクリップボードにコピーするような場合Windowsのクリップボードから32ビットのRGBAイメージを取得する
UPDATE:ここには私がこれまで持っているものです。
HGLOBAL clipboard = GetClipboardData(CF_DIBV5);
exists = clipboard != NULL;
int dataLength = GlobalSize(clipboard);
exists = dataLength != 0;
if (exists) {
LPTSTR lockedClipboard = GlobalLock(clipboard);
exists = lockedClipboard != NULL;
if (exists) {
BITMAPV5HEADER *header = (BITMAPV5HEADER*)lockedClipboard;
LONG width = header->bV5Width;
LONG height = header->bV5Height;
BYTE *bits = header + sizeof(header) + header->bV5ClrUsed * sizeof(RGBQUAD);
//Now what? Need function to convert the bits to something uncompressed.
GlobalUnlock(clipboard);
}
}
はUPDATE 2:
明確にするために、私はしかし、操作することができ、文字通り非圧縮32ビットの画像データ(RRGGBBAA)が必要です私はクロスプラットフォームのアプリが好きです。このイメージを画面に描画するためにWindows APIを使用する必要はありません。
私は必要なデータの種類に.bmps、.jpgs、および.pngをロードできる、stdb_image.h
という第三者のライブラリを知っています。だから、アルファを失うことなくクリップボードのデータをビットマップやPNGファイルに変換する方法があれば、私はうまくいくでしょう。
'GetDIBits'と' SetDIBits'は、DIBとDDB間のビットマップデータを変換し、 'BITMAPINFO'のパラメータに従って変換します。 – GSerg
アルファ透明度レベルを必要としない限り、 'GetClipboardData(CF_BITMAP)'で十分です。これまで行ってきたことと、特定のプログラムで何が問題になっているのかを示してください。(Microsoft paint.exeは問題にならないはずです) –
getDIBits関数を理解しています。私はアルファが必要です。インデックスされていないビットマップのように見えますが、アルファは4バイト目です(各ピクセルはRGBだけでも長いピクセルを使用する必要があります)が、アルファがあるかどうかを判断するためにヘッダーには何もありません。 – Tenfour04