我正在对一个程序进行一些逆向工程工作。我试图从旧数据中提取的一件事是从下面的颜色托盘中选择的颜色
旧软件引用颜色的方式是通过托盘中的索引(所以 0 是白色,1 是黄色,2 是橙色,等等)。上面的托盘是某种类型的标准布局吗?
我最大的希望是找到一些内置于 .NET 的类,我可以在其中传递相同的索引号并取回颜色,但是我对找到这么好的东西并不抱太大希望。
除了使用油漆和吸管手动绘制整个表格之外,还有什么选项可以让我更轻松地完成这项工作吗?
我正在对一个程序进行一些逆向工程工作。我试图从旧数据中提取的一件事是从下面的颜色托盘中选择的颜色
旧软件引用颜色的方式是通过托盘中的索引(所以 0 是白色,1 是黄色,2 是橙色,等等)。上面的托盘是某种类型的标准布局吗?
我最大的希望是找到一些内置于 .NET 的类,我可以在其中传递相同的索引号并取回颜色,但是我对找到这么好的东西并不抱太大希望。
除了使用油漆和吸管手动绘制整个表格之外,还有什么选项可以让我更轻松地完成这项工作吗?
这是一个 16 x 16 = 256 的调色板。旧软件可能将此调色板存储在gif 文件中。您可以从此调色板构建一个十六进制值数组(硬编码或在运行时)。
第一行是“有用的”颜色行。
第 2 行到第 8 行将色相值从 338° 色相转换为 335° 色相。
第 9 到 15 行显示 0°、30°、60°、116°、180°、230° 和 300° 的 (7) 色调和 (8) 色调(HSB 颜色模型)。
最后一行显然是灰度。
我认为这不是标准布局。如果你想要一个精确的值,你需要使用吸管......
我最终使用了SLaks 的建议,只是在图像上循环并从每个正方形的中心读取像素值。这是我运行的快速概念验证测试,将所有颜色加载到 a 中TableLayoutPanel
,并且效果很好。
private void button1_Click(object sender, EventArgs e)
{
string pngPath = @"E:\Color Pallet.png";
tableLayoutPanel1.Controls.Clear();
using (var bitmap = new Bitmap(pngPath))
{
for (int i = 0; i < 256; i++)
{
var color = bitmap.GetPixel(5 + (10*(i%16)), 5 + (10*(i/16)));
tableLayoutPanel1.Controls.Add(new Panel {Dock = DockStyle.Fill, BackColor = color}, i % 16, i / 16);
}
}
@SLaks,如果您发布自己的答案,我将删除我的答案并接受您的答案。
您可以编写一些代码来读取该位图并检查像素以在您提取的位图中构建调色板。