気象衛星画像をデスクトップに

端末に入れてたImage::Magickモジュールを壊してしまい,Perlで書いた気象衛星画像取得スクリプトが動かなくなってしまいました.Image::Magickを入れなおせばよかったんですが,なんとなく思いついてcsharpのプログラムを書き直してみました.今回やってみたのは,以下の3点です.

  1. 1時間ごとにデータを取得する.
  2. 取得した画像を拡大する.
  3. dos窓を隠す(というか閉じるというほうが正解か?)
// weather.cs
//  
using System;
using System.Threading;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Net;
using System.Text;
using System.Runtime.InteropServices;

public class Weather
{
	[DllImport("user32.dll")]
	public static extern int SystemParametersInfo (
		int uAction,
		int uParam,
		[MarshalAs(UnmanagedType.LPStr)] string lpvParam,
		int fuWinIni);
	[DllImport("kernel32.dll")]
	public static extern Boolean FreeConsole();

	static void Main()
	{
		string imageURL = "http://www.jwa.or.jp/sat/images/sat-japan.jpg";
		string toFile   = "asas.bmp";

		FreeConsole();

		do
		{
			WebRequest  req = WebRequest.Create(imageURL);
			WebResponse res = null;
			try
			{
				res = req.GetResponse();
			}
			catch
			{
			}
			Stream rec = res.GetResponseStream();
			Bitmap src = new Bitmap(rec);

			int w = Convert.ToInt32(src.Width * 1.2);
			int h = Convert.ToInt32(src.Height * 1.2);

			Bitmap dest = new Bitmap(w, h);
			Graphics g = Graphics.FromImage(dest);
			g.DrawImage(src, 0, 0, w, h);
			dest.Save(toFile, ImageFormat.Bmp);
			dest.Dispose();
			src.Dispose();
			rec.Close();

			SystemParametersInfo(20, 0, Path.GetFullPath(toFile), 0x1|0x2);
			Thread.Sleep(360000);
		}while(true);
	}
}

1時間ごとにデータを取得するために,Sleepを使いました.360000msecで1時間になります.

Thread.Sleep(360000);

取得した画像を拡大するには,まず,取得した画像のサイズを取得して,それを何倍に拡大するかを決めます.

Bitmap src = new Bitmap(rec);
int w = Convert.ToInt32(src.Width * 1.2);
int h = Convert.ToInt32(src.Height * 1.2);

それから,別に作ったBitmapに貼り付け,ファイルに保存します.

Bitmap dest = new Bitmap(w, h);
Graphics g = Graphics.FromImage(dest);
g.DrawImage(src, 0, 0, w, h);
dest.Save(toFile, ImageFormat.Bmp);

dos窓を隠すには,

[DllImport("kernel32.dll")]
public static extern Boolean FreeConsole();

を使います.このAPIを実行すると,プログラムをdos窓から分離することができます.でもただ単にweather.exeと実行しても,何の反応のないdos窓が残るだけで,使う際にはdos窓から"start weather.exe"と実行する必要があります.

起動時に"weather.exe"を起動するためには,"C:\Documents and Settings\WHOAMI\スタート メニュー\プログラム\スタートアップ"に(WHOAMIのところには自分のログイン名が入ります)"weather"というショートカットを作って,そのリンク先に'C:\WINDOWS\system32\cmd.exe /C "start weather"'と書きます.起動時には数秒dos窓が見えますが,そのうちいなくなります.ホントはwindowsアプリケーションとして作成して,そのフォームを隠すんでしょうが,手抜きプログラミングだとこんなものではないかと.

ちゃんちゃん.