« 2008年07月19日 | メイン | 2008年07月21日 »

2008年07月20日

画像からGetPixelでピクセル情報を取得し、セルの色を変更(Excel VBA)

画像からGetPixelでピクセル情報を取得し、セルの色を変更する Excel VBAのコードを書いてみました。
Excelで使える色数に制限があるため、うまくいかないこともありますが、
作ってしまったので載せておきます。

なぜこんなものを作ったかというと、以前の記事と組み合わせて、
画像からピクセル情報をテキストに落としたかったため。

C#を使えばすぐにできるのですが、Excelのセルにも反映させてたら
おもしろそうだと思ってしまったためです。思ったより苦労しました。
VBAでいろいろやろうとすると難しいです><


★概要
・画像を読み込み、Pixel情報を取得
・Excelのセルの色を取得した色に変更
・取得した値をセルの値として入力
excel_pixel_test.png
↑実行のイメージ
 ※実際はセルに値が入ります。
 ※Excelの制限により、うまく色がつかないことがあります。
  ⇒参考記事


※画像関連の主要コード(WinAPIを使って、hDCを取得するところ)は
 「Excel VBA質問箱 IV」の「 【54098】Re:フォーム上のイメージに文字を追加する方法」
 http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=54098;id=excel
 のコードを使わせていただきました。ありがとうございます。
 まだ未整理のため、使わないコードもまざっていますがご了承ください。

Excel_UserForm.png
↑あらかじめCommandButton1、Image1をUserFormに作成しておきます。
 今回、コードはUserForm1だけに書くだけでよいです。
 C:\test.bmp"にテスト用の画像を配置しておきます。
 (サンプルでは20*20まで。重くなるが、コード変更でさらに大きい画像でも対応可)



追記:
「excel vba ゲーム」で検索してみたら、
pacmanパックマン
http://www.geocities.jp/nchikada/pac/index.htm
を見つけました。
Excelのセルの色だけでアクションゲームを作ってしまっています。
これはすごいです。まねできません・・・。


追記2:
エクセルを使って動画にしている人がいました(笑)
さすがにリアルタイムではなくて、
動画からビットマップ抜き出し
⇒減色ツールで減色
⇒Excelのセルに反映
⇒Excel画面のスクリーンショットを取る
⇒上記をつなげて動画にする
のようにしているみたいです。

エクセルでひぐらしのなく頃に解OP‐ニコニコ動画(夏)
http://www.nicovideo.jp/watch/sm1642964

おまけを解説してみた‐ニコニコ動画(夏)
http://www.nicovideo.jp/watch/sm2026262


◆おすすめ減色ソフト
Padie - 高精度な減色専用ツール
http://www.vector.co.jp/soft/win95/art/se063024.html

Excelでセルの色を変える - Interior.Colorでうまくいかない(Excel VBA)

前回のExcel VBAでは、オレンジが46など、
Excel VBA特有の色の指定の仕方をしました。

⇒例)
  Range("A1").Interior.ColorIndex = 46


ところで、Excel VBAでは、このような指定の仕方以外にも
RGBを指定して色を変えられるようです。
⇒例)
  Range("A1").Interior.Color = RGB(255, 255, 0)

そこで、その方法を使ってみましたが、うまく行かないこともあるような・・・。
理論上は任意の色を作り出せるはずですが、できないことがあります。
(私のやり方が悪いのかもしれないですが・・・)


ためしにサンプルを作ってみました。
RGBの値を1ずつ変えながら実行するだけのものです。
本当ならきれいなグラデーションとなるはずが、色が分離してしまっています↓

Excel_Cell_Color_1.png
↑色が分かれてしまっている(Excel VBAでのセルの色分けテスト)
 
 
Vcs_Color_2.png
↑本来はこうなるはず(Visual C#での色塗りテスト)
 
  
もう一例やってみたので紹介します(続きから)

やはりだめなよう。
Excel_Cell_Color_2.png
↑色が分かれてしまっている(Excel VBAでのセルの色分けテスト)
 しかも、途中に変な灰色がはいっている・・・。
 
 
Vcs_Color_1.png
↑本来はこうなるはず(Visual C#での色塗りテスト)


回避方法がわかる方、教えてください・・・。

追記:
以下のページに同じ悩みがありました。やはり同時に使える色が限られているようです。
Excelのセルの色の変更方法

同時に使える色が限られてはいますが、
下記のように、カラーパレットを変更すると任意の色にすることはできます。
ThisWorkbook.Colors(1) = RGB(255, 123, 0)
 
以下のページが参考になります。
エクセル:カラーパレット
http://adamontn.blog.ocn.ne.jp/analyst/2007/05/post_4164.html
 
 
※カラーパレットの変更はExcelのメニューバーの
 ツール⇒オプション⇒タブ「色」 からも可能
Excel_Option_Color.png