在Windows窗体中将int转换为Color

本文关键字:转换 Color int Windows 窗体 | 更新日期: 2023-09-27 17:58:59

行中有一个值等于-16777056,但如何将其强制转换为Color?

类似的东西:

Color = (Color) Convert.ToInt32(((DataRowView)this.dataGridView1.Rows[e.RowIndex].DataBoundItem)["Color"]) })

在Windows窗体中将int转换为Color

颜色和数字之间的转换被称为颜色书写联觉,患有这种情况的人可以识别数字的颜色(甚至形状或"感觉")。然而,这里有一个棘手的问题,那就是它从未在计算机中被识别出来(只在人身上)。此外,这种情况通常是由于人的遗传,但在使用迷幻药后也有报道。虽然我永远不会建议使用非法药物,但我想给你的CPU塞一些LSD可能值得一试。

还有一个困难是,联觉者之间没有共同点——也就是说,数字6对我来说和对你来说颜色不一样。因此,这些在你的电脑上的渲染效果可能与在我的电脑上不同。(有点像"哇,伙计,我怎么知道对我来说"蓝色"的东西看起来不像我认为的"红色"对你来说?"但我们又回到了非法药物。)

这就是我将数字转换为颜色的方法。也就是说,除非你的数字实际上代表了一些有用的东西,比如ARGB颜色值。在这种情况下,您可以使用:

Color.FromArgb(numericValue);

试试这个:

var argb = Convert.ToInt32(
    ((DataRowView)this.dataGridView1.Rows[e.RowIndex].DataBoundItem)["Color"]);
Color = Color.FromArgb(argb);

好吧,你知道颜色最初是如何变成那个整数的吗?我的猜测是,它是一个由串联字节组成的ARGB值。

如果是这样,这是最简单的方法:

var myColor = Color.FromArgb(myColorInt);

它会被集成到你的实际代码行中,比如:

var myColor = Color.FromArgb(Convert.ToInt32(((DataRowView)this.dataGridView1.Rows[e.RowIndex].DataBoundItem)["Color"]) }));
Color myColor = Color.FromArgb(Convert.ToInt32(((DataRowView)  
    this.dataGridView1.Rows[e.RowIndex].DataBoundItem)["Color"])});

编辑:在阅读了您上面的一条评论后,您可能可以稍微简化一下所有内容。尝试分配所选颜色,如下所示:

((DataRowView)this.dataGridView1.Rows[e.RowIndex].DataBoundItem)["Color"] = 
    colorDialog.Color;

然后像这样读出来:

Color myColor = 
    ((DataRowView)this.dataGridView1.Rows[e.RowIndex].DataBoundItem)["Color"];

通过这种方式,您可以将其保存为Color,并将其检索为Color,并跳过中间转换步骤。

这可能适用于也可能不适用于其他一些修改,具体取决于数据源是否存储Color而不是当前定义的int

您不能使用此

Color color = System.Drawing.Color.FromArgb(0xFFAABBCC);

因为输入参数是int,并且0xFFAABBCC在int 的范围之外

你已经使用了这个

Color color = System.Drawing.Color.FromArgb(0xFF, System.Drawing.Color.FromArgb(0xAABBCC));

或者在您的项目中创建此函数。

Color color = GetColor(0xFFAABBCC);
public static Color GetColor(uint color) {
    return Color.FromArgb((byte) ((color >> 24) & 0xFF), (byte) ((color >> 16) & 0xFF), (byte) ((color >> 8) & 0xFF), (byte) (color & 0xFF));
}

使用此函数:

System.Drawing.Color LongToColor(long colorNumber)
{
    int a = Int32.Parse(((colorNumber & 0xFF000000L) >> 24).ToString());
    int r = Int32.Parse(((colorNumber & 0x00FF0000L) >> 16).ToString());
    int g = Int32.Parse(((colorNumber & 0x0000FF00L) >> 8).ToString());
    int b = Int32.Parse((colorNumber & 0x000000FFL).ToString());
    return System.Drawing.Color.FromArgb(a, r, g, b);
}

示例

var redColor = LongToColor(0x00FF0000);
var greenColor = LongToColor(0x0000FF00);
var blueColor = LongToColor(0x000000FF);
var other = LongToColor(0xBBABCDEF);
Console.WriteLine(redColor);
//Color [A=0, R=255, G=0, B=0]
Console.WriteLine(greenColor);
//Color [A=0, R=0, G=255, B=0]
Console.WriteLine(blueColor);
//Color [A=0, R=0, G=0, B=255]
Console.WriteLine(other);
//Color [A=187, R=171, G=205, B=239]