C#将图像放入ImageList会稍微改变图像的颜色吗?

时间:2017-09-25 22:54:34

标签: c# colors imagelist

我不确定这是否是故意的,但我已经做了一些实验,显然,当你将一个Image放入ImageList时,Image的颜色会稍微改变。

例如,我有一个图像(144x144),颜色为ARGB(255,247,215,193)。将其放入ImageList然后在PictureBox中显示图像后,颜色已更改为ARGB(255,239,214,198)。虽然差别不大,但差别很大。

是否有理由发生这种情况,或者是ImageLists的某种错误?有没有办法在使用ImageLists显示图像时避免这种颜色偏移?

以下是一些展示此行为的示例代码:

        string filePath = directoryPath + "/Images/Test/Test.png";

        Bitmap TestImage1 = (Bitmap)Image.FromFile(filePath);
        MessageBox.Show(TestImage1.GetPixel(0, 0).ToString());

        ImageList IL = new ImageList();
        IL.ImageSize = new Size(144, 144);
        IL.Images.Add(Image.FromFile(filePath));
        Bitmap TestImage2 = (Bitmap)IL.Images[0];
        MessageBox.Show(TestImage2.GetPixel(0, 0).ToString());

第一个MessageBox显示“Color [A = 255,R = 247,G = 215,B = 193]”。 第二个MessageBox显示“Color [A = 255,R = 239,G = 214,B = 198]”。

以下是一个非常轻微的色差示例:https://i.stack.imgur.com/m7beR.png

1 个答案:

答案 0 :(得分:0)

您的代码有几行,这使得很难确切地确定发生了什么。

为什么IL.ImageSize = new Size(144, 144);在那里?这对你的形象有什么影响?我拿出来了。

接下来,当您执行IL.Images.Add(Image.FromFile(filePath));时,您将重新加载图片。 IL.Images.Add(TestImage1);查看引用是否发生变化会更有启发性。

如果您运行此代码:

    Bitmap TestImage1 = (Bitmap)Image.FromFile(filePath);
    Console.WriteLine(TestImage1.GetPixel(0, 0).ToString());

    ImageList IL = new ImageList();
    IL.Images.Add(TestImage1);
    Bitmap TestImage2 = (Bitmap)IL.Images[0];

    Console.WriteLine(TestImage2.GetPixel(0, 0).ToString());
    Console.WriteLine(TestImage1.GetPixel(0, 0).ToString());

    Console.WriteLine(TestImage1.Equals(TestImage2));

然后你会得到类似的东西:

Color [A=255, R=249, G=249, B=249]
Color [A=255, R=255, G=251, B=240]
Color [A=255, R=249, G=249, B=249]
False

这告诉您,当您将图像添加到图像列表时,它正在创建一个新图像。参考文献不一样。

如果您查看ImageList的来源,您会看到各种类似的代码:

    bitmap1 = new Bitmap((Image) bitmap2, this.ImageSize);
    if (ownsBitmap)
      bitmap2.Dispose();
    ownsBitmap = true;

它正在进行大量的图像管理并在整个地方创建副本。因此,假设ImageList永远不会保留对原始图像的引用。