Properties.Resources.Image无法与ImageList

时间:2016-05-29 00:46:49

标签: c# image winforms bitmap imagelist

我正在制作一个有骰子的游戏,点击它们时,更改颜色但保持相同的数字。

我正在使用ImageLists(作为要求)并使用红色和蓝色模具。它们使用位图设置。我不确定图像与位图的工作方式,但我看到了使用位图的建议,所以我接受了它。

 private Bitmap redDie1 = Properties.Resources.die1;
    private Bitmap blueDie1 = Properties.Resources.die1s;
    private Bitmap redDie2 = Properties.Resources.die2;
    private Bitmap blueDie2 = Properties.Resources.die2s;
    private Bitmap redDie3 = Properties.Resources.die3;
    private Bitmap blueDie3 = Properties.Resources.die3s;
    private Bitmap redDie4 = Properties.Resources.die4;
    private Bitmap blueDie4 = Properties.Resources.die4s;
    private Bitmap redDie5 = Properties.Resources.die5;
    private Bitmap blueDie5 = Properties.Resources.die5s;
    private Bitmap redDie6 = Properties.Resources.die6;
    private Bitmap blueDie6 = Properties.Resources.die6s;

然后我通过向它们添加变量来设置我想要使用的ImageLists(redDieImages,blueDieImages)。使用变量testImages我看到redDie1是否变量,以及我添加到redDieImages的redDie1是否相等。调试模式下该变量为false。

      private void Form1_Load(object sender, EventArgs e)
    {
        diceLabels[0] = diceLabel1;
        diceLabels[1] = diceLabel2;
        diceLabels[2] = diceLabel3;
        diceLabels[3] = diceLabel4;
        diceLabels[4] = diceLabel5;

        redDieImages.Images.Add(redDie1);
        redDieImages.Images.Add(redDie2);
        redDieImages.Images.Add(redDie3);
        redDieImages.Images.Add(redDie4);
        redDieImages.Images.Add(redDie5);
        redDieImages.Images.Add(redDie6);
        //redDieImages.ImageSize = new Size(dieImageSize, dieImageSize);

        blueDieImages.Images.Add(blueDie1);
        blueDieImages.Images.Add(blueDie2);
        blueDieImages.Images.Add(blueDie3);
        blueDieImages.Images.Add(blueDie4);
        blueDieImages.Images.Add(blueDie5);
        blueDieImages.Images.Add(blueDie6);
        //blueDieImages.ImageSize = new Size(dieImageSize, dieImageSize);

        bool testImages = redDie1 == redDieImages.Images[0];

我正在使用图像列表来查看哪些标签将被点击以更改模具的颜色包含每张图片(6张图片的骰子,1-6张图片)。 dicelabelIndex只是来自我用来存储图像的标签数组。在ContainsImage中,我试图检查redDieImages的哪个索引包含红色图像,以便我可以用蓝色版本的图像替换它。 diceLabel单击允许我使用ContainsImage方法更改图像的颜色。

       private int ContainsImage(int diceLabelsIndex)
    {
        int itemIndex = -1;
        int count = redDieImages.Images.Count;

        for (int i = 0; i < redDieImages.Images.Count; i++)
        {
            if (diceLabels[diceLabelsIndex].Image == redDieImages.Images[i])
            {
                itemIndex = i;
                break;
            }
        }

        return itemIndex;
    }

    private void diceLabel1_Click(object sender, EventArgs e)
    {
        int imageIndex = ContainsImage(0);

        if (diceLabel1.Image == redDieImages.Images[imageIndex])
        {
            diceLabel1.Image = blueDieImages.Images[imageIndex];
        }
        else
        {
            diceLabel1.Image = redDieImages.Images[imageIndex];
        }
    }

总的来说,我需要帮助确保图像相同,以便在ContainsImage中对它们进行比较,这样我就可以在用户点击标签时切换图像。然而,即使图像来自同一个变量,图像也不相等。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

ImageList不会存储Images已修改的副本。因此,您不能仅为同一件事创建参考的副本!

查看ImageSizeColorDepth变量!它们很严重:将图像添加到ImageList后,会创建一个带有尺寸和颜色深度的新图像。

所以redDie1 == redDieImages.Images[0]确实总是假的。

相反,您可以使用字符串作为图像的Key

首先将其存储在位图&#39; Tag财产:

private Bitmap redDie1 = Properties.Resources.die1;
redDie1.Tag = "redDie1";

接下来在将图像添加到ImageList时使用它:

redDieImages.Images.Add(redDie1.Tag.ToString(), redDie1);

现在你可以像这样编写你的测试:

bool testImages = redDie1.Tag.ToString() == redDieImages.Images.Keys[0];

另请注意参考和值参数之间的区别:即使ImageSizeColorDepth相同,仍会创建新副本并在两个副本之间进行比较总是假的。即使您从相同来源加载两个 Images变量,它们相等..

相反,情况确实如此:

Bitmap copy1 = redDie1;         // contains a reference to redDie1
bool test = copy1 == redDie1;   // true

为了完整性&#39;清酒:系统对strings的规则进行例外处理,以允许更自然的比较,但不允许图像。

顺便说一下:Image是一个超类,可以是几件事,最值得注意的是Bitmap Icon ..