【问题标题】:Windows Phone 8 - change color in bitmapWindows Phone 8 - 更改位图中的颜色
【发布时间】:2015-05-21 15:31:38
【问题描述】:

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

【问题讨论】:

    标签: c# visual-studio windows-phone-8 image-processing colors


    【解决方案1】:

    首先,这是一种将 WritableBitmap 更改为您选择的颜色的方法。

        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;
        }  
    

    此方法的导入:

    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    

    我还添加了如何立即使用此方法,因为加载 BitmapImage 可能非常烦人(它不会立即从 URI 加载,因此您很容易得到 NullPointer 异常,这就是我使用 StreamResourceInfo 之类的东西的原因)

    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));
    

    上面的代码加载图片,将黑色不透明的颜色变成红色,放入变量newWbm

    【讨论】:

    • 我不建议使用SetPixel 方法,因为它很慢。更好的解决方案是直接操作像素。
    • 我刚刚在答案中添加了我的解决方案;)
    【解决方案2】:

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

    我的一些应用程序使用这种方法来处理像素,我希望尽快完成,所以永远不要使用SetPixelGetPixel(例如MC Skin EditorMC Skin Viewer)。

    为了将 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 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;
    }
    

    【讨论】:

    • 很好,太糟糕了,当我在看这个答案时,这个答案不在互联网上:)。
    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    相关资源
    最近更新 更多