Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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# Windows Phone 8-更改位图中的颜色_C#_Visual Studio_Windows Phone 8_Image Processing_Colors - Fatal编程技术网

C# Windows Phone 8-更改位图中的颜色

C# Windows Phone 8-更改位图中的颜色,c#,visual-studio,windows-phone-8,image-processing,colors,C#,Visual Studio,Windows Phone 8,Image Processing,Colors,如何将位图的一种颜色更改为另一种颜色?首先,这是一种将可写位图更改为另一种颜色的方法 public static WriteableBitmap ChangeColor(WriteableBitmap writeableBitmapOriginal, Color originalColor, Color newColor) { var writeableBitmapNew = new WriteableBitmap(writeableBitmapOriginal)

如何将位图的一种颜色更改为另一种颜色?

首先,这是一种将可写位图更改为另一种颜色的方法

    public static WriteableBitmap ChangeColor(WriteableBitmap writeableBitmapOriginal, Color originalColor, Color newColor)
    {
        var writeableBitmapNew = new WriteableBitmap(writeableBitmapOriginal);

        for (int i = 0; i < writeableBitmapNew.PixelWidth; i++)
        {
            for (int j = 0; j < writeableBitmapNew.PixelHeight; j++)
            {                    
                if (writeableBitmapOriginal.GetPixel(i, j).Equals(originalColor))
                {
                    writeableBitmapNew.SetPixel(i, j, newColor);
                }
            }
        }
        return writeableBitmapNew;
    }  
我还添加了如何立即使用此方法,因为加载BitmapImage可能非常烦人(它不是从URI立即加载的,因此您可以很容易地获得NullPointer异常,这就是我使用StreamResourceInfo之类的东西的原因)


上面的代码加载图片,将黑色不透明颜色更改为红色,并将其放入变量
newWbm

您的解决方案使用的
GetPixel
SetPixel
方法非常慢。直接处理像素可以更快地获得相同的结果。但在此之前,我们必须知道如何将
Color
转换为int,因为
WriteableBitmap
中的像素由int数组表示

我的一些应用程序使用这种方法来操作像素,我希望尽可能快地操作,所以永远不要使用
SetPixel
GetPixel
(例如)

要将
Color
转换为int,我做了以下简单的扩展:

public static int ToInt(this Color color)
{
    return unchecked((int)((color.A << 24) | (color.R << 16) | (color.G << 8) | color.B));
}
public static int-ToInt(此颜色)
{

返回未选中((int)((color.A我不建议使用
SetPixel
方法,因为它很慢。更好的解决方案是直接操作像素。我只是在答案中添加了我的解决方案;)很好,太糟糕了,当我在看答案时,这个答案不在互联网上:)。
Uri uri = new Uri("Assets/Icons/ic_black_star_fav.png", UriKind.Relative);
StreamResourceInfo resourceInfo = Application.GetResourceStream(uri);
BitmapImage img = new BitmapImage();
img.SetSource(resourceInfo.Stream);
WriteableBitmap wbm = new WriteableBitmap(img);
WriteableBitmap newWbm = YourClassWithThisMethod.ChangeColor(wbm,Color.FromArgb(255, 0, 0, 0), Color.FromArgb(255, 255, 0, 0));
public static int ToInt(this Color color)
{
    return unchecked((int)((color.A << 24) | (color.R << 16) | (color.G << 8) | color.B));
}
public static WriteableBitmap ChangeColor(WriteableBitmap writeableBitmapOriginal, Color originalColor, Color newColor)
{
    var writeableBitmapNew = new WriteableBitmap(writeableBitmapOriginal);
    originalColorInt = originalColor.ToInt();
    newColorInt = newColor.ToInt();

    for (int i = 0; i < writeableBitmapNew.Pixels.Length; i++)
        if (writeableBitmapNew.Pixels[i] == originalColorInt)
            writeableBitmapNew.Pixels[i] = newColorInt;
    return writeableBitmapNew;
}