1

アプリ (RGBA8888 画像で動作) が Windows クリップボードから画像を貼り付けられるようにしたいです。したがって、Gimp、Photoshop、MSPaint などの一般的なラスター画像アプリからの画像をクリップボードから読み取ることができるはずです。

クリップボード関数を読むと、私は呼び出すことができるはずですGetClipboardData(CF_DIBV5)Windows はそれと CF_BITMAP および CF_DIB の間で自動的に変換するため、クリップボードにあるほとんどすべてのビットマップ タイプにアクセスできます。しかし、DIB フォーマットを読んでみると、ビット深度、RGB オーダー、オプションの圧縮などの可能な組み合わせが無数にあることがわかります。 Windows API には変換関数が見当たりません (検索が苦手な場合を除きます)。考えられるすべての形式をサポートするには、これを記述するのに 1 週​​間かかるようです。ですから、明らかなことを見落としていないかどうか疑問に思っています。または、これを単純化するために私が行うことができる何らかの仮定がある場合...人気のあるすべての画像アプリがたまたま非圧縮/非インデックス形式で画像をクリップボードにコピーする場合など.

更新:これが私がこれまでに持っているものです:

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);
    }
}

更新 2:

明確にするために、文字通り非圧縮の 32 ビット イメージ データ (RRGGBBAA) が必要です。これは、クロスプラットフォーム アプリで好きなように操作できます。この画像を画面に描画するために Windows API を使用する必要はありません。

stdb_image.h.bmps、.jpgs、および .pngs を必要なタイプのデータにロードできるというサードパーティ製ライブラリがあることを認識しています。したがって、アルファを失わずにクリップボード データをビットマップまたは png ファイル データに変換できる方法があれば、問題はありません。

4

2 に答える 2