0

我自己写了一个小的颜色选择器代码,效果很好。但是问题是,当我移动幻灯片以获取选定颜色(RGB)时,画布(白色黑色渐变和选定颜色需要时间。延迟是因为代码: 在此处输入图像描述

代码如下:

Try
    'Dim converter As New SlidertoColor
    'Dim cornercolor As Color = converter.Convert(MySlider.Value, Nothing, Nothing, Nothing)

    Dim cornercolor As Color = Value
    Dim y As Integer = 0
    Dim x As Integer = 0


    Dim wb As New WriteableBitmap(256, 256, 96, 96, PixelFormats.Pbgra32, Nothing)
    Dim stride As Integer = CInt((wb.PixelWidth * wb.Format.BitsPerPixel) / 8)

    Dim RD As Decimal = cornercolor.R / 255
    Dim GD As Decimal = cornercolor.G / 255
    Dim BD As Decimal = cornercolor.B / 255

    Dim r As Decimal = cornercolor.R
    Dim g As Decimal = cornercolor.G
    Dim b As Decimal = cornercolor.B

    Dim lr As New List(Of Decimal)
    Dim lb As New List(Of Decimal)
    Dim lg As New List(Of Decimal)

    Try
        For i = 0 To 255
            lr.Add(r)
            r = r - RD
            lg.Add(g)
            g = g - GD
            lb.Add(b)
            b = b - BD
        Next

    Catch ex As Exception

    End Try

    r = cornercolor.R
    g = cornercolor.G
    b = cornercolor.B

    'For y = 255 To 0 Step -1
    For y = 0 To 255
        RD = ((255 - y) - lr(y)) / 255
        GD = ((255 - y) - lg(y)) / 255
        BD = ((255 - y) - lb(y)) / 255

        If RD < 0 Then
            RD = RD * -1
        End If
        If GD < 0 Then
            GD = GD * -1
        End If
        If BD < 0 Then
            BD = BD * -1
        End If

        'Need to work on this section
        r = 255 - y
        g = 255 - y
        b = 255 - y


        For x = 0 To 255
            Try
                Dim colorData As Byte() = {
                CByte(b),
                CByte(g),
                CByte(r),
                CByte(255)}

                Dim rect As New Int32Rect(x, y, 1, 1)
                wb.WritePixels(rect, colorData, stride, 0)

                r = r - RD
                g = g - GD
                b = b - BD

                If r < 0 Then
                    r = 0
                End If
                If g < 0 Then
                    g = 0
                End If
                If b < 0 Then
                    b = 0
                End If
            Catch ex As Exception

            End Try

        Next
    Next

    'Dim colorData As Byte() = {CByte(blue), CByte(green),
    '                           CByte(red), CByte(255)}
    'Dim rect As New Int32Rect(x, y, 1, 1)

    'Try
    '    wb.WritePixels(rect, colorData, stride, 0)
    'Catch ex As Exception
    'End Try

    Dim k As New ImageBrush
    k.ImageSource = wb
    Return k

你能告诉我如何加快这个过程,或者有没有一种有效的方法来实现这一点。我知道有免费使用的颜色选择器,但我想尝试自己的。我正在使用 VB.Net,WPF。谢谢你。

4

1 回答 1

2

找到了答案,看来梯度图也是用xaml完全一样的方式制作的,如下:

</Canvas>-->
    <Canvas Width="256" Height="256" Margin="32,30,215,26">
        <Canvas.Background>
            <LinearGradientBrush StartPoint="0 0.5" EndPoint="1 0.5">
                <GradientStop Color="White" Offset="0" />
                <GradientStop Offset="1" Color="{Binding ElementName=MySlider, Path=Value, Converter={StaticResource SlidertoColor1}}" />
            </LinearGradientBrush>
        </Canvas.Background>
        <Canvas Width="256" Height="256">
            <Canvas.Background>
                <LinearGradientBrush StartPoint="0.5 0" EndPoint="0.5 1">
                    <GradientStop Color="Transparent" Offset="0" />
                    <GradientStop Color="Black" Offset="1" />
                </LinearGradientBrush>
            </Canvas.Background>
        </Canvas>
    </Canvas>

谢谢您的支持。

于 2012-09-02T05:56:56.763 回答