簡體   English   中英

Windows Phone 8 - 更改位圖中的顏色

[英]Windows Phone 8 - change color in bitmap

如何將位圖的一種顏色更改為另一種顏色?

您的解決方案使用了非常慢的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;
}

首先,這是一種將 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM