アプリ版:「スタンプのみでお礼する」機能のリリースについて

環境はWindows、VisualStudio2010です。


既存のBMPファイルなどとは全く無関係に

座標(0,0)にRGBで255,255,0
座標(0,1)にRGBで255,0,255
...
全体の大きさは縦x横 = 20,30
背景の色はRGBで0,0,0

の情報があるとします。生データで、1ドットの大きさとかの概念はありません。

これをクリップボードに画像として存在する方法はありますか?


ネットを検索すると、既存の画像ファイルをクリップボードにコピーする等の方法はありましたが、自分の生データをそうする手段が無かったです。

質問者からの補足コメント

  • 返答ありがとうございます。

    CかC++の完結したまたは完結に近いサンプルは無いでしょうか。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/03/12 00:03
  • 先ほど、tknakamuri殿回答でコンソールアプリケーションの場合はどうする?との間の抜けた再質問をしてしまいましたが、NULLを指定して解決しました。

      補足日時:2018/03/13 15:16

A 回答 (3件)

HGLOBAL hGlobal= GlobalAlloc(GHND | GMEM_SHARE,


sizeof(BITMAPINFOHEADER) + 32 * 32 * sizeof(DWORD));

BITMAPINFOHEADER *pBmpInfoHeader = (BITMAPINFOHEADER *)GlobalLock(hGlobal);
ZeroMemory(pBmpInfoHeader, sizeof(BITMAPINFOHEADER));
pBmpInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
pBmpInfoHeader->biWidth = 32;
pBmpInfoHeader->biHeight = 32;
pBmpInfoHeader->biPlanes = 1;
pBmpInfoHeader->biBitCount = 32;
pBmpInfoHeader->biCompression = BI_RGB;

DWORD *pBits = (DWORD *)(pBmpInfoHeader + 1);
for(int y=0; y<32; ++y){
for(int x=0; x<32; ++x) pBits[y*32+x] = (red << 16) + (green << 8) + blue;
}

GlobalUnlock(hGlobal);

if(OpenClipboard(GetHWND()) != 0){
EmptyClipboard();
SetClipboardData(CF_DIB, hGlobal);
CloseClipboard();
}

こんなのが基本。red、green、blueは適当に置き換えて下さい。
32BITRGBの場合です。

Bottom-up bitmap になってますが
Top-down bitmapにするなら
biHeightを負にして下さい。

また、biBitCount が32以外の場合、もう少し気を使う必要が有ります。
    • good
    • 0
この回答へのお礼

返答ありがとうございます

書き忘れましたが、作っているのはコンソールアプリケーションです。
GetHWNDが無かったので省略したところ、正常終了してもクリップボード上に画像が無かったです。
どうすればいいのでしょうか。

#include "stdafx.h"

#include <Windows.h>
// GetHWNDはafxctl.h? コンソールアプリケーションでは無い?

int _tmain(int argc, _TCHAR* argv[]) {
 HGLOBAL hGlobal= GlobalAlloc(GHND | GMEM_SHARE,sizeof(BITMAPINFOHEADER) + 32 * 32 * sizeof(DWORD));

割愛

 DWORD *pBits = (DWORD *)(pBmpInfoHeader + 1);
 for(int y=0; y<32; ++y){
  for(int x=0; x<32; ++x) {
   int red = 255;
   int green = 255;
   int blue = 255;
   pBits[y*32+x] = (red << 16) + (green << 8) + blue;
  }
 }

 GlobalUnlock(hGlobal);

// if(OpenClipboard(GetHWND()) != 0){
  EmptyClipboard();
  SetClipboardData(CF_DIB, hGlobal);
  CloseClipboard();
// }

 return 0;
}

お礼日時:2018/03/13 15:08

メモリ上にDIBという形式で画像データを作り


CF_DIB 形式を指定してクリップボードにメモリハンドルを
渡すのが基本。
この回答への補足あり
    • good
    • 0

例えば、


CreateBitmapでビットマップを作成。
BitBltで質問者さんのデータをビットマップにコピー。ないし書き込み。
OpenClipboardでクリップボードを開く。
EmptyClipboardでクリップボードを空に。
SetClipboardDataでビットマップを格納。
とか。


こちらは.bmpからビットマップを読み込む処理ですが。

F-Basic Programming Tips - クリップボードへ転送と取り出し(BITMAP)
http://tokovalue.jp/SetClipboardData_U.htm
    • good
    • 0
この回答へのお礼

返答ありがとうございます。

HPを見ましたが、CかC++では無いようです。
CかC++の完結したまたは完結に近いサンプルは無いでしょうか。

お礼日時:2018/03/12 00:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!