Windows Phone 8 - 改变位图中的颜色
Windows Phone 8 - change color in bitmap
如何将位图的一种颜色更改为另一种颜色?
首先,这是一种将 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
.
您的解决方案使用 GetPixel
和 SetPixel
方法,它们非常慢。您可以直接在像素上更快地获得相同的结果。但在此之前我们必须知道如何将Color
转换为int,因为WriteableBitmap
中的像素由int数组表示。
我的一些应用程序使用这种方法来操纵像素,我想尽快完成,所以永远不要使用 SetPixel
或 GetPixel
(例如 MC Skin Editor, MC 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
.
您的解决方案使用 GetPixel
和 SetPixel
方法,它们非常慢。您可以直接在像素上更快地获得相同的结果。但在此之前我们必须知道如何将Color
转换为int,因为WriteableBitmap
中的像素由int数组表示。
我的一些应用程序使用这种方法来操纵像素,我想尽快完成,所以永远不要使用 SetPixel
或 GetPixel
(例如 MC Skin Editor, MC 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;
}