我不确定这是否是故意的,但我已经做了一些实验,显然,当你将一个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
答案 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
永远不会保留对原始图像的引用。