在Windows中,一般任何格式的图像加载后,应该都可以看成是一片按照BMP格式布置的连续的内存,C#中利用GDI+的Lockbits函数得到的地址我想绝对不是这个内存快的首地址,他应该是系统另外分配了一块内存,然后用相关数据填充的,LockBits要另外分配内存的原因也是很明显的,因为他会按照用户的要求将原始的图像数据按照系统指定的方式转换成用户的格式。这样对图像进行操作的时候,比如一些常用的滤镜,就要先分配一块内存,然后在把这块内存的数据写回去,对程序的速度造成极大的影响。在GDI中,如果我们创建一个DIBSECITON,就可以直接访问图像数据的内存地址,然后修改他,.net中有这样的函数吗?期待中。。

解决方案 »

  1.   

    我认为你理解错了LockBits 后, 就可以直接操作图像数据了            Bitmap bitmap = new Bitmap("c:\\test.bmp");
                BitmapData data = bitmap.LockBits();
                data.Scan0;   //这个就是首地址
      

  2.   

    LockBits 后, 就可以直接操作图像数据了,是的,但是这里的data.Scan0只是LockBits 这个函数另外分配内存后的那块内存的首地址,并不是原始图像数据在内存中的地址。
      

  3.   


    Lock和得到的地址就是图像数据本身的地址,只有在你Lock的格式和原图像的格式不一样的情况下,返回的才是新分配的内存地址实际上根本就不需要再这方面多操心,相对于滤镜处理花费的时间,内存复制所花费的时间连零头都算不上
      

  4.   

    如果要精确操作内存建议不要用C#来做
    ==================================
    可以的,用指针,不过要放在
    unsafe
    {
        //你的指针操作
    }