メールアドレスをそのままサイトに掲載するとスパムメールが・・・。ということで本当は公開したくないけど公開しないといけないので画像で公開している方も多いと思います。そこでメールアドレスを画像で出力するアプリケーションを作成します。
画像ファイルとして保存できるだけでなく、HTMLでも使えるように
<img src = “data:image/png;base64,XXXXXXXXXXXXXX” />
の形でも出力できます。これなら画像なしでそのまま貼り付けることもできます。
ではやってみましょう。
メールアドレスとフォント、前景色、背景色、マージンを指定してボタンを押すと、ファイルとして保存したり、HTMLファイルとして出力することができます。
まずImageを取得するメソッドを示します。
Bitmapを用意してそこにメールアドレスを書き込んでいるのですが、メールアドレスの長さがわからないので大きめのビットマップを用意して、そこに書き込み、文字がある部分を調べます。適切な大きさのBitmapを再度作り直してそれを返しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
public partial class Form1 : Form { Image GetImage() { string str = textBox1.Text; if(str == "" || StringFont == null || StringColor == Color.Empty) return null; Color frontColor = StringColor; Color backColor = StringBackColor; int margin = (int)numericUpDownMargin.Value; Bitmap bitmap1 = new Bitmap(1000, 1000); Graphics g = Graphics.FromImage(bitmap1); g.Clear(backColor); backColor = bitmap1.GetPixel(0, 0); // 背景色を保存 g.DrawString(str, StringFont, new SolidBrush(frontColor), new Point(0, 0)); g.Dispose(); int width = bitmap1.Width; int height = bitmap1.Height; int minX = -1; int minY = -1; int maxX = -1; int maxY = -1; // 文字がある部分を調べる // 背景色と違う色であれば文字がある部分と考える List<Point> pts = new List<Point>(); for(int x = 0; x < width; x++) { for(int y = 0; y < height; y++) { Color color = bitmap1.GetPixel(x, y); if(color != backColor) { pts.Add(new Point(x, y)); } } } // 文字がある部分と見なして切り取る部分を確定する minX = pts.Min(x => x.X); minY = pts.Min(x => x.Y); maxX = pts.Max(x => x.X); maxY = pts.Max(x => x.Y); Bitmap bitmap2 = new Bitmap(maxX - minX + margin * 2, maxY - minY + margin * 2); Graphics g2 = Graphics.FromImage(bitmap2); g2.Clear(backColor); g2.DrawImage(bitmap1, new Rectangle(margin, margin, maxX - minX, maxY - minY), new Rectangle(minX, minY, maxX - minX + 1, maxY - minY + 1), GraphicsUnit.Pixel); g2.Dispose(); bitmap1.Dispose(); return bitmap2; } } |
フォントと前景色、背景色はフィールド変数に格納します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { Font StringFont = null; Color StringColor = Color.Empty; Color StringBackColor = Color.Empty; public Form1() { InitializeComponent(); // フィールド変数の初期化 FontDialog dialog = new FontDialog(); StringFont = dialog.Font; dialog.Dispose(); StringColor = Color.Black; StringBackColor = Color.White; } } |
各ボタンが押されたときに処理をおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
public partial class Form1 : Form { // フォントの設定 private void ButtonFont_Click(object sender, EventArgs e) { FontDialog dialog = new FontDialog(); if(StringFont != null) dialog.Font = StringFont; if(dialog.ShowDialog() == DialogResult.OK) { StringFont = dialog.Font; } dialog.Dispose(); } // 前景色の設定 private void ButtonColor_Click(object sender, EventArgs e) { ColorDialog dialog = new ColorDialog(); dialog.Color = StringColor; if(dialog.ShowDialog() == DialogResult.OK) { StringColor = dialog.Color; } dialog.Dispose(); } // 背景色の設定 private void ButtonBackColor_Click(object sender, EventArgs e) { ColorDialog dialog = new ColorDialog(); dialog.Color = StringBackColor; if(dialog.ShowDialog() == DialogResult.OK) { StringBackColor = dialog.Color; } dialog.Dispose(); } // ファイルとして保存する private void ButtonSaveFile_Click(object sender, EventArgs e) { Image image = GetImage(); if(image == null) { MessageBox.Show("正しく設定されていません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "(*.png)|*.png|(*.jpg)|*.jpg|(*.gif)|*.gif"; if(dialog.ShowDialog() == DialogResult.OK) { System.IO.FileInfo info = new System.IO.FileInfo(dialog.FileName); if(info.Extension == ".png") image.Save(dialog.FileName, System.Drawing.Imaging.ImageFormat.Png); if(info.Extension == ".jpg") image.Save(dialog.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); if(info.Extension == ".gif") image.Save(dialog.FileName, System.Drawing.Imaging.ImageFormat.Gif); } image.Dispose(); dialog.Dispose(); } // HTMLコードを出力する private void ButtonHTML_Click(object sender, EventArgs e) { Image image = GetImage(); if(image == null) { MessageBox.Show("正しく設定されていません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } using(System.IO.MemoryStream ms = new System.IO.MemoryStream()) { image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); richTextBox1.Text = "<img src = \"data:image/png;base64," + Convert.ToBase64String(ms.ToArray()) + "\" />"; } } // テストとしてピクチャーボックスにイメージを表示する private void ButtonTest_Click(object sender, EventArgs e) { Image image = GetImage(); if(image == null) { MessageBox.Show("正しく設定されていません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } pictureBox1.Image = image; } } |
HTMLコードを取得してHTMLファイルに貼り付ければ・・・以下のようになります。