Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#LinearGradientBrush位图垂直重复_C#_Winforms_Colors_Bitmap_Gradient - Fatal编程技术网

C#LinearGradientBrush位图垂直重复

C#LinearGradientBrush位图垂直重复,c#,winforms,colors,bitmap,gradient,C#,Winforms,Colors,Bitmap,Gradient,我正在使用Microsoft Vision API,一边学习C#,Vision对象的一个属性是图像的“强调色” 从一系列分析过的图像中,我想展示那些按线性梯度排列的颜色——因为这将能够向用户显示大多数图片(例如)是蓝色的,因为蓝色占据了梯度的一半等等 我有这个工作,因为我是按色调排序的颜色,并能够产生一个线性梯度,我填充到位图 但是,默认情况下渐变是水平的,我需要垂直的——因此我使用了LinearGradientBrush.RotateTransform(90),它将实际渐变旋转得很好,但似乎不

我正在使用Microsoft Vision API,一边学习C#,Vision对象的一个属性是图像的“强调色”

从一系列分析过的图像中,我想展示那些按线性梯度排列的颜色——因为这将能够向用户显示大多数图片(例如)是蓝色的,因为蓝色占据了梯度的一半等等

我有这个工作,因为我是按色调排序的颜色,并能够产生一个线性梯度,我填充到位图

但是,默认情况下渐变是水平的,我需要垂直的——因此我使用了LinearGradientBrush.RotateTransform(90),它将实际渐变旋转得很好,但似乎不会填充整个矩形,并且会重复。这就是我得到的结果:

如何创建一个垂直直线半径来填充位图矩形对象的整个高度?

这是我的密码:

    private Bitmap CreateColorGradient(System.Drawing.Rectangle rect, System.Drawing.Color[] colors)
    {
        Bitmap gradient = new Bitmap(rect.Width, rect.Height);

        LinearGradientBrush br = new LinearGradientBrush(rect, System.Drawing.Color.White, System.Drawing.Color.White, 0, false);
        ColorBlend cb = new ColorBlend();

        // Positions
        List<float> positions = new List<float>();
        for (int i = 0; i < colors.Length; i++) positions.Add((float)i / (colors.Length - 1));
        cb.Positions = positions.ToArray();

        cb.Colors = colors;
        br.InterpolationColors = cb;
        br.RotateTransform(90);

        using (Graphics g = Graphics.FromImage(gradient))
            g.FillRectangle(br, rect);

        return gradient;
    }
私有位图CreateColorGradient(System.Drawing.Rectangle、System.Drawing.Color[]颜色)
{
位图渐变=新位图(矩形宽度、矩形高度);
LinearGradientBrush br=新的LinearGradientBrush(rect,System.Drawing.Color.White,System.Drawing.Color.White,0,false);
ColorBlend cb=新的ColorBlend();
//职位
列表位置=新列表();
对于(inti=0;i

感谢您的阅读和帮助——如果您在我的代码中看到一些可以做得更好的地方,请指出它有助于我学习:)

您忽略了。当你在Grahics对象上旋转时,你的画笔矩形不再正确地适合目标位图,并且渐变无法填充它;所以它重复了

纠正

  • 只需将角度设置为
    90
    ,然后
  • 移除
    br.旋转变换器(90)呼叫
在这里,将结果从左侧更改为中间版本:

当我们查看它时,一定要注意
LinearGradientBrush
WrapMode
属性。您在第一个图像中看到的是默认的
WrapMode.Clamp
。通常,切换到其中一种翻转模式会有所帮助。。让我们来看看它的影响,第一个版本在正确的位置

它看起来像
WrapMode.TileFlipY
,但由于我恢复了旋转,它实际上需要一个值
WrapMode.TileFlipX
WrapMode.TileFlipXY

br.WrapMode=WrapMode.TileFlipX

没问题。一定要看一看关于WrapMode的最后几句话,它经常很方便。。