注册 登录
编程论坛 C# 论坛

C# winform 中画网格

gxlove 发布于 2014-06-12 13:51, 1216 次点击
怎么在winform中实现像photoshop等图像处理软件,显示网格功能,而且显示很快!我试了一下直接在winfrom中能画网格,但画大网格时就非常非常慢,比如:画单元格为32px的2000x2000的网格那是非常非常慢。如果改为以下缓存画图,当行列数超过400时就报错。
        Bitmap bmp = new Bitmap(2000*32, 2000*32);
            Graphics g = Graphics.FromImage(bmp);
            pictureBox1.Image = bmp;
           for (int c = 0; c < 2000; c++)
            {
                x1 = 2000 * 32;
                y1 = 0;
                x2 = 2000 * 32;
                y2 = 2000* 32;
                g.DrawLine(p,x1,y1,x2,y2);
            }
                pictureBox1.Image = bmp;

图像处理等软件的网格绘制如此之快,请问怎么实现?谢谢!
4 回复
#2
wangnannan2014-06-12 14:54
大小取决于本机内存和色深

[ 本帖最后由 wangnannan 于 2014-6-12 14:56 编辑 ]
#3
wangnannan2014-06-12 14:54
程序代码:
   private void button10_Click(object sender, EventArgs e)
         {
             //测试 待建图片大小
             int dw =int.Parse(textBox2.Text);
             int dh = int.Parse(textBox3.Text);
             //最大打开次数
             int n = int.Parse(textBox4.Text);
             //实际打开次数
             int i = 0;
             while (true)
             {
                 try
                 {
                     i++;
                     Bitmap dx = new Bitmap(dw, dh);
                 }
                 catch
                 {
                     MessageBox.Show("打开数量:"+i.ToString());
                     break;
                    
                 }
                 if (i == n)
                 {
                     MessageBox.Show("达到最大值:" + n.ToString());
                     break;
                 }
             }

            GC.Collect();
         }
你可以测试一下你本机最大能打开的数量
#4
wangnannan2014-06-12 14:58
图像处理软件 咱就拿PS来说吧 那是C++开发的 可以直接操作底层的内存
而楼主呢 用的是C# 靠GC回收 GC有多垃圾 就不用多说了吧 何况还是GDI+ 没法比的 不在一个级别
#5
gxlove2014-06-12 18:21
回复 4 楼 wangnannan
感谢wangnannan的回复。上面你的代码我测试了一下,“待建图片大小”两个都是2000,“最大打开次数”输入1000大概15秒弹出对话框“达到最大值:1000”。
用bitmap缓存画线既然不能创建太大画布,那我还是改为在pictureBox1中画。但有个问题就是当画出所有线后,窗体最大或最小化时所有的线就会被清除,这个问题怎么解决?
说一下我的项目:在winform窗体中添加了一个splitContainer1控件,然后在左边panel中添加一个pictureBox1控件,并在其中进行画网格线,当画好后窗体最大或最小化所有线就会消失。

[ 本帖最后由 gxlove 于 2014-6-12 18:54 编辑 ]
1