【问题标题】:Set a transparent color设置透明色
【发布时间】:2011-03-02 13:01:21
【问题描述】:

我有一个Color,并且我有一个方法应该返回该颜色的更“透明”版本。我尝试了以下方法:

public static Color SetTransparency(int A, Color color)
{
   return Color.FromArgb(A, color.R, color.G, color.B);
}

但由于某种原因,无论A 是什么,返回的Color 的透明度级别都不会改变。

有什么想法吗?

【问题讨论】:

  • 您如何使用Color?错误可能就在那里。
  • 这应该可以,但是你在哪里使用颜色?有些控件不能很好地处理 alpha 值。
  • @strager,我正在使用 SetTransparency 返回的颜色,但它不在我的控制范围内,很有趣。
  • 代码无法编译(因为您在其中使用颜色而不是颜色),因此您无法从该方法中得到任何东西。您应该显示您实际使用的代码。通过查看其他一些您没有使用的代码,很难在您正在使用的代码中找到错误...
  • @Guffa,这实际上是我使用的代码。 Color.R 实际上是color.R,我已经修复了。

标签: c# colors


【解决方案1】:

嗯,对我来说看起来没问题,只是您使用的是Color.R(等)而不是color.R - 您确定您实际上使用的是返回的Color,而不是假设它会改变现有的颜色?您如何确定“透明度级别”不会改变?

这是一个示例,显示返回颜色中的 alpha 值确实正确:

using System;
using System.Drawing;

class Test
{
    static Color SetTransparency(int A, Color color)
    {
        return Color.FromArgb(A, color.R, color.G, color.B);
    }
    
    static void Main()
    {
        Color halfTransparent = SetTransparency(127, Colors.Black);
        Console.WriteLine(halfTransparent.A); // Prints 127
    }
}

那里没有惊喜。如果您提供一个简短但完整的程序来演示您遇到的确切问题,那将非常有帮助。你确定无论你用颜色做什么,甚至支持透明度?

请注意,此方法实际上已经以Color.FromArgb(int, Color) 存在。

【讨论】:

  • 是的,我正在使用返回的Color
  • 我认为我使用的组件可能有问题。我去问问组件提供商看看
【解决方案2】:

只需使用正确的 FromArgb 重载

var color = Color.FromArgb(50, Color.Red);

【讨论】:

    【解决方案3】:

    您的命名可能有问题。 我制作了一个标准的 Windows 窗体项目,有 2 个按钮并添加了一些代码,当单击按钮时,它们各自的颜色实际上会消失。

    我同意 Jon Skeet 的观点,你正在实现一个重复的方法,所有参数名称都应该以小写字母开头,所以 'a' 而不是 'A'

    代码:

    private void Form1_Load(object sender, EventArgs e)
    {
        button1.BackColor = Color.Red;
        button2.BackColor = Color.Green;
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        Color c = button1.BackColor;
        button1.BackColor = Color.FromArgb(Math.Max(c.A - 10, (byte)0), c.R, c.G, c.B);
    }
    
    private void button2_Click(object sender, EventArgs e)
    {
        Color c = button2.BackColor;
        button2.BackColor = Color.FromArgb(Math.Max(c.A - 10, (byte)0), c.R, c.G, c.B);
    }
    
    public static Color SetTransparency(int a, Color color)
    {
        return Color.FromArgb(a, color.R, color.G, color.B);
    }
    

    【讨论】:

      【解决方案4】:

      您可以为Color 类编写一个扩展方法,该方法返回一个新的Color,修改后的alpha 值如下:

      public static class ColorExtensions
      {
          public static Color WithOpacity(this Color color, double opacity)
          {
              return Color.FromArgb((int)(opacity * 255), color);
          }
      }
      

      用法

      var orange = Color.Orange;
      var orange1 = orange.WithOpacity(0.5);
      
      Console.WriteLine($@"R={orange.R} G={orange.G} B={orange.B} A={orange.A}");
      Console.WriteLine($@"R={orange1.R} G={orange1.G} B={orange1.B} A={orange1.A}");
      

      Live Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 2016-09-25
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        • 2017-11-02
        相关资源
        最近更新 更多