c# 能实现像Photoshop那样的涂抹效果吗?
请大侠们指教
不胜感谢!!!

解决方案 »

  1.   

    WPF:<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <InkCanvas></InkCanvas>
        </Grid>
    </Window>完成. ^_______^你如果用的是winform, 那么可以用WPF做墨迹控件,在winform中载入WPF控件。
      

  2.   

     我用的是.net 2.0,不是3.5,没有wpf,不想装3.0以上版本,太大了,客户受不了
      

  3.   

    涂抹的肯定可以实现,可我这没现成的例子,倒有一个逆反效果以及浮雕效果的图片处理实例,希望能给楼主一点点帮助:
    逆反处理:
    private void buttonNifan_Click(object sender, EventArgs e)
            {
                Bitmap bmp = new Bitmap(pictureBox1.Image);
                Color c=new Color ();
                int r = 0;
                int g = 0;
                int b = 0;
                int i = 0;
                int j = 0;
                for (i = 0; i <= pictureBox1 .Width ;i++)     //逆反操作不能用于动画;
                    for (j = 0; j <=pictureBox1 .Height ;j ++)
                    {
                        c = bmp.GetPixel(i,j);
                        r = c.R;
                        g = c.G;
                        b = c.B;
                      r = 255 - r;
                        g = 255 - g;
                        b = 255 - b;
                        if (r < 0)
                            r = 0;
                        if (r> 255)
                            r= 255;                    if (g  < 0)
                            g = 0;
                        if (g  > 255)
                            g = 255;                    if (b < 0)
                            b  = 0;
                        if (b > 255)
                            b = 255;                    c = Color.FromArgb(r,g,b);
                        //c = Color.FromArgb(255 - c.R, 255 - c.G, 255 - c.B);  //另类表示
                        bmp.SetPixel(i, j, c);
                    }
                pictureBox2.Refresh();
                pictureBox2.Image = bmp;
                buttonFudiao.Enabled = true;
            }
    浮雕效果:
     private void buttonFudiao_Click(object sender, System.EventArgs e)
            {
                Bitmap bmp1 = new Bitmap(pictureBox1.Image);
                Bitmap bmp2 = new Bitmap(pictureBox2.Image);
                Color c1 = new Color();
                Color c2 = new Color();
                Color c = new Color();            int i, j, r = 0, g = 0, b = 0;
     
                for (i=0;i<pictureBox1 .Width ;i++)
                    for (j = 0; j < pictureBox1.Height; j++)
                    {
                        c1 = bmp1.GetPixel(i, j);
                        c2 = bmp1.GetPixel(i + 1, j + 1);                    r = Math.Abs(c1.R - c2.R + 128);
                        g = Math.Abs(c1.G - c2.G + 128);
                        b = Math.Abs(c1.B - c2.B + 128);                    if (r < 0)
                            r = 0;
                        if (r > 255)
                            r = 255;                    if (g < 0)
                            g = 0;
                        if (g > 255)
                            g = 255;                    if (b < 0)
                            b = 0;
                        if (b > 255)
                            b = 255;                    c = Color.FromArgb(r, g, b);
                        bmp2.SetPixel(i,j ,c);
                    }
                pictureBox2.Refresh();
                pictureBox2.Image = bmp2;        }
      

  4.   

    怎么说呢,其实最近我也写了一些仿PS的,如上图的ImageDraw,还花了4小时设计了载入画面(上图),滤镜方面只是一些脚本,而我恰恰就在实时动态绘制上停下脚步了,我在我的博客删除了我要写个中国的PS的文章.
    涂抹效果包含3层:
    1 源区域色的二次模糊
    2 鼠标速度的快速检查
    3 DX的加速
    在我实际开发过程中,第1步,也就是二次模糊是没问题的,而在.NET中,由于窗体界面本身的PAINT现象,会造成大量MOUSEMOVE检测点的丢失,第3点,用DX加速亦得开发一套内存接管与鼠标处理的开放接口.
    我不想做的原因主要就是:我不会DX编程.所以也是提醒一下,虽然只是一个涂抹,在鼠标移动时不同的速度,也是要不同的计算的,并且在实时的鼠控(鼠标控制)绘制中,鼠标移动一个点,画面就得重画一次,在这个过程中,不但PAINT造成了大量MOUSEMOVE点的丢失,更是很难想象不使用DX加速的情况下,即使是使用LOCKBITS这样的直接内存操作,也是无法达到的.
    我只是说说我的经验,没有提供技术信息,分就不用了.
      

  5.   

    上CODEPROJECT去找源码。有的我见过。
      

  6.   

    不一定需要DX的,GDI+ 的绘制性能还是不错的,我用.net做过CAD方面的开发,利用双缓冲和一些类似的技术(比如将不需要刷新的部分先存成内存位图)拖动绘制(比如移动节点、旋转、缩放)完全可以达到无明显闪烁的效果。关键是要有好的算法和好的GPU(PS在烂机器上跑的也不快)
      

  7.   

    GDI+ 的绘制性能和GDI相比不是差那么一点点的,这在GDI+的技术文章中也有明确的说法的。
    凡是涉及到鼠标操作的滤镜,因为要实时的显示处理的结果,即使设置了Clipregion,不断的移动也会造成mousemove事件中鼠标点的丢失,这样给人的感觉就是绘制的不连续。开源的软件paint.net中也有一些鼠标动态调整的效果,可惜那个是个很庞大的工程,我还不晓得他是如何实现的。
      

  8.   

    哈哈,我做个小软件,不用ArcGis吧