龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

Silverlight编程之控制位图亮度及对比度调节、浮雕效果、放大镜效果

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
Silverlight 以 DirectX 为绘图基础,但不知出于什么考虑, Microsoft 并没有在 Silverlight 中提供在调色板机制(该机制在 WPF 中依然有效),因此对位图的处理我们所能想到的就是以像素为单

SilverlightDirectX为绘图基础,但不知出于什么考虑,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的效果:


精彩图集

赞助商链接