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 に答える