c#分割鼠标单击图像

时间:2015-07-30 21:11:25

标签: c#

基本上,我正在创建一个简单的表单应用程序,用于501飞镖游戏。我的想法是使用飞镖板的图像,这样用户就可以点击它们在棋盘上的位置(例如 - 他们掷出一个16,他们在飞镖板上点击16,这从总得分中得到16)

我的问题 - 我可以只使用一张图片并将其设置为在特定位置点击更改值吗?因此,点击16中的任何位置都会删除值16,等等。我不认为这是可能的,但我认为值得问。

或者是唯一的方法是单独为每个数字创建一个图像并将它们组合在一起形成飞镖板的图像?

谢谢!

2 个答案:

答案 0 :(得分:1)

我会从飞镖图像生成第二张图像,为每个评分区域应用独特的颜色。当用户单击飞镖图像时,您将获得X,Y位置并在第二个图像上执行像素查找。将像素颜色与分数表进行比较。

使用独特的颜色需要查找表,如Score -= Table[pixel[x][y]],而您也可以直接将分数应用于颜色通道,像素查找将获得您的分数。例如:Score -= pixel[x][y].red

下面是一个C#Winform程序,我在SharpDevelop中快速制作了针对.NET 4.0的原型

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Diagnostics;

namespace PictureClicker
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        Bitmap dartboard;
        Bitmap scoreboard;

        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();

            //
            // TODO: Add constructor code after the InitializeComponent() call.
            //
            dartboard = new Bitmap("dartboard.bmp");
            scoreboard = new Bitmap("scoreboard.bmp");
        }
        void MainFormPaint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(dartboard, 0, 0);
        }
        void MainFormMouseUp(object sender, MouseEventArgs e)
        {
            int score = scoreboard.GetPixel(e.X, e.Y).ToArgb(); // Convert pixel to 32-bit representation to facilitate comparison

            // Lookup table
            if (score == Color.Red.ToArgb()) RecordScore(16); // Red FF0000
            else if (score == Color.Lime.ToArgb()) RecordScore(8); // Green 00FF00
            else if (score == Color.Blue.ToArgb()) RecordScore(4); // Blue 0000FF
            else if (score == Color.Yellow.ToArgb()) RecordScore(2); // Yellow FFFF00
            else if (score == Color.Magenta.ToArgb()) RecordScore(1); // Purple (Magenta) FF00FF
            else if (score == Color.Cyan.ToArgb()) RecordScore(100); // Cyan 00FFFF
            else
                Debug.WriteLine("Unknown Score");
        }

        void RecordScore(int _score)
        {
            Debug.WriteLine("Hit: " + _score.ToString());
        }
    }
}

飞镖图像: Dartboard

记分牌图片: Scoreboard

答案 1 :(得分:0)

最简单的方法是使用Tesseract 光学字符识别。但请记住,飞镖板上只有数字板,因此确定每个内部瓷砖的分数可能很困难。