【问题标题】:Converting ARGB to Hex将 ARGB 转换为十六进制
【发布时间】:2016-04-02 08:14:59
【问题描述】:

我正在尝试根据已下载文件的百分比来制作变色 mehapps metroui 进度条。在 lua 中我喜欢这样:

ARGB(255, 255 * percent, 255 - (255 * percent), 0)

现在尝试在 C# 中执行此操作:

void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    double bytesIn = double.Parse(e.BytesReceived.ToString());
    double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
    double percentage = bytesIn / totalBytes * 100;
    label2.Content = "Downloaded " + (e.BytesReceived / 1000) + "kb" + " of " + (e.TotalBytesToReceive / 1000) + "kb" + " (" + Math.Round(percentage) + "%)";
    progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
    Color myColor = Color.FromArgb(255, 255 * (Math.Round(percentage)), 255 - (255 * (Math.Round(percentage))), 0);
    string hex = myColor.R.ToString("X2") + myColor.G.ToString("X2") + myColor.B.ToString("X2");
    Console.WriteLine(hex);
}

label2 效果很好,但 mycolor 行错误:

无法从双精度转换为字节。

我什至尝试使用progressBar1.Value 并得到同样的错误。我究竟做错了什么?有没有更简单的方法可以让我的进度条根据下载百分比从红色变为绿色?

【问题讨论】:

标签: c# .net rgb


【解决方案1】:

整个事情可以简单得多。

void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    label2.Content = string.Format("Downloaded {0}kb of {1}kb ({2}%)", e.BytesReceived / 1000, e.TotalBytesToReceive / 1000, e.ProgressPercentage);
    progressBar1.Value = e.ProgressPercentage;
    int c = e.ProgressPercentage * 255 / 100;
    // unused, but this would be how you'd get it
    // Color myColor = Color.FromArgb(255, (byte)(255 - c), (byte)c, 0);
    string hex = string.Format("FF{0:X2}{1:X2}00", 255 - c, c);
    Console.WriteLine(hex);
}

我在这里做了什么:

  • 在大多数地方使用e.ProgressPercentage
  • 通过将颜色缩放为整数来完全避免双打(避免到处都是Round)。注意乘法和除法的顺序。
  • 使用string.Format
  • 转换为字节,避免Convert

顺便说一句,这在红色和绿色之间线性插值,这意味着它在中间穿过暗黄色,而不是实际的黄色。为了通过黄色,你可以使用类似的东西

int s = e.ProgressPercentage * 255 / 50;
int r = Math.Min(255, 510 - s);
int g = Math.Min(255, s);

然后以明显的方式进行。

编辑:根据要求交换红色/绿色。

【讨论】:

  • 这完全简单易懂。
  • Og 当然,使用 C# 6(每个人都应该使用它,因为它比以前的版本好多了;),1string.Format 行可以更改为 string hex = $"FF{c:X2}{255-c:X2}00";
  • 好的,我尝试了一个小时来弄清楚如何自己完成此操作,但我无法确定它很简单,您发布的内容很好,除了它从绿色变为红色,我需要它从红色变为绿色,我该如何反转它?
  • @loveroflua 您的原始代码不也是这样做的吗?我试着让它一样。反正只要把红色和绿色交换一下,没什么大不了的。不过我会编辑它。
【解决方案2】:

将有问题的行改为

Color myColor = Color.FromArgb(255, Convert.ToByte(255 * Math.Round(percentage/100)), 255 - Convert.ToByte(255 * (Math.Round(percentage/100))), 0);

您必须将 percentage 除以 100 才能获得从 0 到 1 的值,然后将结果转换为字节,因为方法 Color.FromArg() 需要字节参数。

【讨论】:

  • 现在无法将 int 转换为 byte
  • 你划分“百分比”了吗?
  • 百分比的类型是 double 还是 int?
  • 您意识到您现在正在舍入 [0,1] 中的双精度数,对吗?
【解决方案3】:

改变这一行

Color myColor = Color.FromArgb(255, 255 * (Math.Round(percentage)), 255 - (255 * (Math.Round(percentage))), 0);

Color myColor = Color.FromArgb(255, 255 * (Math.Round(percentage / 100)), 255 - (255 * (Math.Round(percentage / 100))), 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多