如题,谢谢!!!

解决方案 »

  1.   

    除非你自己编码加载图片,否则通过PictureBox的Image属性加载图片是不可能控制进度的.因为整个加载过程都被封装了,我们无法得知当前加载了图片多少数据.
      

  2.   

    我收回我上面的话.刚刚研究了下,发现还是可以实现的.代码及说明如下:
    System.IO.FileStream fs = new System.IO.FileStream  
       (path,
        System.IO.FileMode.Open);
    byte[] byteBuffer = new byte[fs.Length];
      

  3.   

    其实我 说的PICTUREBOX控件只是个事例,其实真正的用途是用于GIS的开发,因为一张遥感图片可以达到200到300M,所以加个进度条
      

  4.   

    to 因为一张遥感图片可以达到200到300M太大了,不可能完全加载,最好是切分成小块,或者提供小点儿所图。
      

  5.   

    AtaLoss0202() 我也有这个想法,用文件流的方式,但是能不能具体点,俺写不出来
    还有网上有个复制文件进度的,速度超慢,不知道是什么原因
      

  6.   

    已经很小了,我用的arcgis所以弄进去也没什么关系,但是我就想弄个加载进度条
      

  7.   

    AtaLoss0202(星空天宇) 兄弟,想个办法把代码贴出来嘛,谢谢了
      

  8.   

    至于用流的话,你可以动态去从文件中去读,然后再写入Image中。
      

  9.   

    Knight94(愚翁) 
    this.axSceneControl1.LoadSxFile(@"G:\LADATA\3D\JCJD.sxd");
    这就是加载地图的方法
      

  10.   

    读我知道,但是怎么写到image中,俺就没有头绪了
      

  11.   

    FileStream fs = new FileStream( FILENAME, FileMode.Open );
    MemoryStream ms = new MemoryStream( fs.Length );
    const int BUF_LENGTH = 1024;
    byte[] bBuffer = new byte[BUF_LENGTH];
    int nTotalLength, nReadLength;
    nTotalLength = nReadLength = 0;
    // Read image 
    do
    {
    nReadLength = fs.Read( bBuffer, 0, BUF_LENGTH );
    if( nReadLength > 0 )
    {
    ms.Write( bBuffer, 0, nReadLength );
    nTotalLength += nReadLength;
    }
    if( nReadLenth < BUF_LENGTH )
    break;
    }while( nTotalLength < fs.Length );// Set your image
    yourPicture.Image = Image.FromStream( ms );// Release streamer
    ms.Close();
    fs.Close();
      

  12.   

    针对你的情况我写下算法吧:
    1.创建对应待加载图像文件文件流(System.IO.FileStream fs)
    2.根据文件大小创建字节数组byte[] byteBuffer = new byte[fs.Length];
    3.通过循环将fs中的内容复制到byteBuffer中,并在复制过程中控制进度条显示进度(通过进度条的Value属性);
    4.创建缓冲区流(System.IO.MemoryStream ms),将byteBuffer作为ms的构造参数来构造它.
    5.通过ms创建一个新的Bitmap对象(Bitmap对象有构造函数是接受Stream参数的).
    6.将刚刚创建的Bitmap对象传递给PictureBox的Image属性,完成加载.
    *注:因为ms是在内存中的,所以加载速度很快.注意在文件加载完毕后要释放byteBuffer数组,否则将占据大量内存.
      

  13.   

    感谢各位的解答,特别是Knight94(愚翁) 与AtaLoss0202(星空天宇)两位同志。我还想问一个问题,就是如果不是pictureBOX,当然也不能用Bitmap对象了,比如arcgis中的axSceneControl控件它使用的是它特点的文件类型,如何解决
      

  14.   

    实际上,从流到PictureBox加载还有一个复制数据的过程,就是从流复制到PictureBox对象中,但因为我们已经将数据读取进内存,所以这个复制过程是在内存中进行的,速度很快,就算200-300M的文件也不会花多少时间.
      

  15.   

    to 比如arcgis中的axSceneControl控件它使用的是它特点的文件类型这可能就涉及到一个文件转换的问题了.你可能需要首先将它的数据格式转换成.NET能够处理的才行.具体的转换方法我也不清楚,对不起.不过,无论是什么文件格式,只要你了解该文件图像的编码方式,以及.NET支持的GDI 位图的编码格式(MSDN有涉及),则解码一般自己都可以写出转换方法.
      

  16.   

    我上面说错了,误解了你的意思.我以为你是要将别个格式的图像文件通过PictureBox显示出来.
    如果你说的那个控件只提供了下面这样的接口:
    this.axSceneControl1.LoadSxFile(@"G:\LADATA\3D\JCJD.sxd");
    那估计不好实现.PictureBox之所以可以,是因为我们在它的外部控制了加载进度(加载进内存),实际上还是没有干预也没有获取PictureBox通过Image属性加载图像的进度.所以,如果你的这个控件只能通过文件路径这一种方式加载图片的话可能是没有办法的.
      

  17.   

    private void button1_Click(object sender, EventArgs e)
                {
                pictureBox1.LoadAsync(Application.StartupPath + "\\img\\1.jpg");
                }        private void pictureBox1_LoadProgressChanged(object sender, ProgressChangedEventArgs e)
                {
                progressBar1.Value = e.ProgressPercentage;
                }