Silverlight以DirectX为绘图基础,但不知出于什么考虑,Microsoft并没有在Silverlight中提供在调色板机制(该机制在WPF中依然有效),因此对位图的处理我们所能想到的就是“以像素为单位,逐个点的处理”。然而Silverlight中的位图处理能力却在WPF的基础上受到了很大的削弱,具体如下
1、Silverlight中不再提供Bitmap类。
2、虽然Silverlight3中提供了WriteBitmap类,但类本身的功能受到了很大削弱,我们甚至无法采用高效的方法把WriteableBitmap输出为Byte[]流。
下面的代码演示了如何通过循环遍历WriteableBitmap的像素点来实现亮度的调节

Code
[http://www.xueit.com]
public void AdjustBright(WriteableBitmap writeableBitmap, int brightness)
{
int[] pixels;
for (int i = 0; i < pixels.Length; i )
{
pixels[i] = writeableBitmap.Pixels[i];
}
if (brightness < -255) brightness = -255;
if (brightness > 255) brightness = 255;
for (int i = 0; i < pixels.Length; i )
{
byte[] bytes = BitConverter.GetBytes(pixels[i]);
for (int j = 0; j < 3; j )
{
int R = bytes[0] brightness;
int G = bytes[1] brightness;
int B = bytes[2] brightness;
//R
if (R < 0)
{
bytes[0] = 1;
}
if (R > 255)
{
bytes[0] = 255;
}
else
{
bytes[0] = (byte)R;
}
//G
if (G < 0)
{
bytes[1] = 1;
}
if (G > 255)
{
bytes[1] = 255;
}
else
{
bytes[1] = (byte)G;
}
//B
if (B < 0)
{
bytes[0] = 1;
}
if (B > 255)
{
bytes[2] = 255;
}
else
{
bytes[2] = (byte)B;
}
}
writeableBitmap.Pixels[i] = BitConverter.ToInt32(bytes, 0);
}
这种方法的效率可想而知。到这里,所有的人都会很失望,传统操作位图的方法在Silverlight中已经关闭,我们似乎再也无法有所作为,然而正所谓“上帝为你关上一扇门,必然为你打开另一扇们”一样,Silverlight中的滤镜(Effect)特征为我们开了一扇新的门,下图演示了Silverlight3中的内置滤镜BlurEffect的效果:

精彩图集