質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

3673閲覧

ATLのCImageクラスを利用しないで、クリップボードからBMP画像データを取得し、画像上のあるピクセルの色情報を抜き出せるようにしたい

kawaoo

総合スコア7

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/06/10 10:10

前提・実現したいこと

ATLのCImageクラスを利用しないで、クリップボードからBMP画像データを取得し、画像上のあるピクセルの色情報を抜き出せるようにしたい,

発生している問題・エラーメッセージ

https://teratail.com/questions/111405
を見ました。
自分の環境
Windows10
VisualStudio2010
ではコンパイルできませんでした。
ピクセルの情報(24bit/pixelかどうか、縦横の大きさ、x,yからバイト列中の場所を計算する方法)があれば十分ですが...

該当のソースコード

C++

1#include <atlimage.h> 2 3// クリップボードからビットマップを取得する関数 4void SampleClipboard() 5{ 6 if(!::IsClipboardFormatAvailable(CF_BITMAP)) 7 { 8 return; 9 } 10 11 if(!::OpenClipboard(NULL)) 12 { 13 return; 14 } 15 16 CImage image; 17 HBITMAP hBitmap = (HBITMAP)::GetClipboardData(CF_BITMAP); 18 if(hBitmap == NULL) 19 { 20 ::CloseClipboard(); 21 return; 22 } 23 24 CImage clip; 25 // 以下割愛 26

試したこと

コンパイルできません。
当然だとは思いますが、Win32の旧来の範疇で実現できないでしょうか。

補足情報(FW/ツールのバージョンなど)

Windows10
VisualStudio2010
未だにWindowsXPでもコンパイルすることがあるので、VS2010を使ってるんです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

コンパイルできないとは、具体的にはどのような状況でしょうか?
CImageクラスはVS2010でも利用可能です。コンパイルできないとすればそれは何か他に原因があるので、まずはそれを解消すべきでしょう。
念のため、たまたまVS2010をインストールした環境が手元に残っていたのでリンク先のコード(私が書いたものですが)を試してみましたが、そのままコピペしてビルドできましたし、正しく実行できていました(保存した画像ファイルで確認)。


GDI+で書いたサンプル

c++

1#include <windows.h> 2#include <gdiplus.h> 3#pragma comment (lib,"gdiplus.lib") 4using namespace Gdiplus; 5 6// クリップボードからビットマップを取得する関数 7void SampleClipboard() 8{ 9 if(!::IsClipboardFormatAvailable(CF_BITMAP)) 10 { 11 return; 12 } 13 14 if(!::OpenClipboard(NULL)) 15 { 16 return; 17 } 18 19 HBITMAP hBitmap = (HBITMAP)::GetClipboardData(CF_BITMAP); 20 if(hBitmap == NULL) 21 { 22 ::CloseClipboard(); 23 return; 24 } 25 26 Bitmap* pClip = Bitmap::FromHBITMAP(hBitmap, NULL); 27 Bitmap* pBitmap = pClip->Clone(0, 0, pClip->GetWidth(), pClip->GetHeight(), PixelFormat32bppRGB); 28 delete pClip; 29 30 ::CloseClipboard(); 31 32 for(UINT y = 0; y < pBitmap->GetHeight(); y++) 33 { 34 for(UINT x = 0; x < pBitmap->GetWidth(); x++) 35 { 36 Color color; 37 pBitmap->GetPixel(x, y, &color); 38 BYTE r = color.GetR(); 39 BYTE g = color.GetG(); 40 BYTE b = color.GetB(); 41 42 // 何かの処理 43 } 44 } 45 46 // 保存はCImageほど簡単ではない 47 UINT numEncoders; 48 UINT size; 49 GetImageEncodersSize(&numEncoders, &size); 50 ImageCodecInfo* pCodecs = (ImageCodecInfo*)malloc(size); 51 GetImageEncoders(numEncoders, size, pCodecs); 52 ImageCodecInfo* pPngCodec = NULL; 53 for(UINT i = 0; i < numEncoders; i++) 54 { 55 ImageCodecInfo* pCodec = &pCodecs[i]; 56 if(wcscmp(pCodec->MimeType, L"image/png") == 0) 57 { 58 pPngCodec = pCodec; 59 break; 60 } 61 } 62 if(pPngCodec != NULL) 63 { 64 pBitmap->Save(L"sample.png", &pPngCodec->Clsid); 65 } 66 free(pCodecs); 67 delete pBitmap; 68} 69 70 71int main() 72{ 73 // GDI+の開始 74 GdiplusStartupInput startupInput; 75 ULONG_PTR token; 76 GdiplusStartup(&token, &startupInput, NULL); 77 78 SampleClipboard(); 79 80 // GDI+の終了 81 GdiplusShutdown(token); 82 return 0; 83}

GDI+を使う場合は、上記main関数のような開始処理と終了処理が必要です。

投稿2018/06/10 14:34

編集2018/06/11 03:55
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kawaoo

2018/06/11 00:27

返答ありがとうございます #include <atlimage.h> がエラーになります。調べるとATLは無料版にしかないそうです。書き忘れましたが、私のVS2010は無料版です。 プロジェクト作成時にATLにチェックボックスがあるのですが、選択できない状態です。 他の無料版コンパイラには、ATL又は代替インクルードファイルがあるのでしょうか?
catsforepaw

2018/06/11 03:42

おっと、Express版でしたか(次からはそれと判るように書いてくださいね)。確かにExpress版はだいぶ機能が限定されているようでATLは使えませんね。 Visual Studio 2017 CommunityならATLが使えますしXP向けのコンパイルもできるので、そちらに移行するということはできませんか? (XP向けはクロス開発になってしまいますが。) とりあえず、ATLが使えないとなると標準で使えるのはGDIかGDI+ですが、GDIはとても面倒くさくて今さら使う気になれないのでGDI+を使います。リンク先のコードをGDI+で置き換えたものを回答の方に載せておきます。
kawaoo

2018/06/11 04:52

返答ありがとうございます 訂正「ATLは無料版にしか」→「ATLは有料版にしか」 業務用で監視を行っているパソコンがXPで、監視ソフト(自作)を監視パソコン上でコンパイルしてるんです。Windows10も持っているのですが、安物ノートなのでVS2017は重いです。削除しちゃいました。単純に作成するとXPでは動かないし... ご紹介のGDI+版を試してみます。
kawaoo

2018/06/14 08:31

先ほど試しました。 成功しました。Windows10上ですが、恐らくXP上でも大丈夫かと。 ありがとうございました。
katahiromz

2018/11/28 09:33

解決済みにしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問