ENGLISH page is here.
GET DinopSearchBar
サイト内検索:
HOME
VC++ TIPS
ダウンロード
DinopExifReader
DinopSearchBar
DinopSearchBar mini
DinopTabbingBar
for Firefox
大阪湾の生き物
甲子園浜の自然
甲子園浜の干潟
甲子園浜の水中
甲子園浜の野鳥
近畿の山々
植物図鑑
箕面マップ
水中機材
カメラ
ランキング
望遠鏡の世界
顕微鏡の世界
Googleのすべて
GoogleマップAPI
ニュース
読んだ本
日記
変な料理の作り方
遺伝子操作
論文紹介
デイトレード
自動売買でFX
ネットで小遣い稼ぎ
Solaris
電子工作
その他
問い合わせ
VC++用コード集
大阪湾の生き物
水中用機材
since:2000/11/15
dinopcom@gmail.com
www.dinop.comは
だいのっぷ・どっと・こむ
と読んでください。







« クジラの揚げ物 | メイン | 画像のポスタライズ処理 »

GDI+を利用した画像処理テストのスケルトン




解説

 最近DirectShowによる動画プログラミングにはまっている。と言ってもフィルタを作って USBカメラからの映像のエッジ検出を行ったりする程度だが...
 そんな動画処理ではフレーム画像を保存しておいて画像の時間変化を見るようなこともし ていたが、結局のところ 動画=静止画の連続 という構図は変わることがなく、静止画を例 にちょっと画像処理を見てみようかと思った。

 まずは簡単に処理部分のプログラミングができるようにスケルトンを作成することにした。 カスタムプロジェクトを作ってもいいのだが、たかがテストのためにそこまで凝らなくても いいかと思い、簡単にコピー&ペーストできるスケルトンを作成することにした。

 画像処理をテストすることだけを目的にしたスケルトンのため、エラー処理もなければ (絶対にやらなければならない)終了処理も省いている。また、ウインドウを描画するた びに画像ファイルを読み込み直すなどかなり実行効率は悪い。

 画像処理のテストをする際にはソースコード中の"画像処理"の部分を変更すればいい。


実行例



ソースコード

 WTLのSDI Applicationでプロジェクトを作成し、...View.hに太字で示したコードを 追加する。この例ではプロジェクト名を「ImageEffect100」にしている。


// ImageEffect100View.h : interface of the CImageEffect100View class
//
/////////////////////////////////////////////////////////////////////////////

#pragma once

#include	"gdiplus.h"
#pragma	comment(lib,"Gdiplus.lib")


class CImageEffect100View : public CWindowImpl
{
public:
	DECLARE_WND_CLASS(NULL)

	BOOL PreTranslateMessage(MSG* pMsg)
	{
		pMsg;
		return FALSE;
	}

	BEGIN_MSG_MAP(CImageEffect100View)
		MESSAGE_HANDLER(WM_PAINT, OnPaint)
	END_MSG_MAP()

// Handler prototypes (uncomment arguments if needed):
//	LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//	LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//	LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)




	LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		CPaintDC dc(m_hWnd);


		////////////////////////////
		//GDI+初期化
		//本当はアプリケーションの初期化時に行うべきだがソースコードの簡易化のためOnPaintに配置
		ULONG_PTR	_nToken;
		Gdiplus::GdiplusStartupInput _sGdiplusStartupInput;
		Gdiplus::GdiplusStartup(&_nToken,&_sGdiplusStartupInput,NULL);


		////////////////////////////
		//画像読み込み
		//ソースコード簡易化のため描画毎に読み出す
		Gdiplus::Bitmap*	pImage;
		Gdiplus::Graphics	cGraphics(dc.m_hDC);

		pImage = Gdiplus::Bitmap::FromFile(L"c:\\test.jpg",TRUE);


		////////////////////////////
		//画像表示(画像処理前)
		cGraphics.DrawImage(pImage,(Gdiplus::REAL)0,(Gdiplus::REAL)0
			,(Gdiplus::REAL)pImage->GetWidth(),(Gdiplus::REAL)pImage->GetHeight());


		////////////////////////////
		//画像処理
		//
		UINT		x;
		UINT		y;
		UINT		nPos;
		RGBTRIPLE*	pTmp;
		Gdiplus::BitmapData		bitmapData;

		pImage->LockBits(&Gdiplus::Rect(0,0,pImage->GetWidth(),pImage->GetHeight())
			,Gdiplus::ImageLockModeRead | Gdiplus::ImageLockModeWrite,PixelFormat24bppRGB,&bitmapData);

		pTmp = (RGBTRIPLE*)bitmapData.Scan0;
		for(y = 0; y < pImage->GetHeight(); y++)
		{
			for(x = 0; x < pImage->GetWidth(); x++)
			{
				nPos = x + (y * bitmapData.Stride) / sizeof(RGBTRIPLE);

				//画像をグリーンにする
				pTmp[nPos].rgbtBlue	= 0;
				pTmp[nPos].rgbtRed	= 0;
			}
		}
		pImage->UnlockBits(&bitmapData);


		////////////////////////////
		//画像表示(画像処理後)
		cGraphics.DrawImage(pImage,(Gdiplus::REAL)pImage->GetWidth() + 2,(Gdiplus::REAL)0
			,(Gdiplus::REAL)pImage->GetWidth(),(Gdiplus::REAL)pImage->GetHeight());

		////////////////////////////
		//画像開放
		delete	pImage;

		////////////////////////////
		//GDI+開放処理
		//本当はアプリケーションの終了時に行うべきだがソースコードの簡易化のため行わない
		//Gdiplus::GdiplusShutdown(_nToken);

		return 0;
	}
};









Copyright (c) 1999-2007 issei. All rights reserved. (運営者情報