Properties.Resources.Image 无法使用 ImageList

Properties.Resources.Image not working with 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;

然后我通过向它们添加变量来设置我想使用的图像列表(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 中比较它们,这样我就可以在用户单击标签时切换图像。然而,即使它们都来自同一个变量,图像也不相等。

感谢您的帮助

ImageList 不存储它们的 Images 修改后的副本 。因此,您不能只创建对同一事物的 引用 的副本!

查看 ImageSizeColorDepth 变量!他们是认真的:将图像添加到 ImageList 后,将创建具有 大小和颜色深度的新图像。

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

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

首先将其存储在位图中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];

还要注意 reference 和 value 参数之间的区别:即使 ImageSizeColorDepth 相同,仍然会创建一个新副本并且两个副本之间的比较总是错误的。即使您从 same 源加载 two Images 变量,它们也是 not等于..

相比之下,这将是正确的:

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

为了完整起见:系统对 strings 的规则进行了例外处理,以允许进行更自然的比较,但不适用于图像。

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