将ARGB转换为十六进制

时间:2015-12-28 13:14:34

标签: c# .net rgb

我正在尝试根据下载文件的百分比来改变mehapps metroui进度条的颜色。在卢阿,我喜欢这样:

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行错误地出现了:

  

无法从double转换为byte。

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

3 个答案:

答案 0 :(得分:4)

这一切都可以简单得多。

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);

然后以明显的方式进行。

编辑:交换红色/绿色作为请求。

答案 1 :(得分:0)

将有问题的行更改为

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获取值,然后将结果转换为byte,因为方法Color.FromArg()需要字节参数。

答案 2 :(得分:0)

更改此行

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);