我通过文件映射内存映射了一个图像文件,现在我需要对该图像进行细化操作,是需要分块处理吧?如何再创建一个缓存区来暂时存放细化后的像素点数据,待整幅图像都处理完成后再将后来的像素点数据复制回原来的图像?还是利用文件映射内存吗?该如何操作?

解决方案 »

  1.   

    用什么都随便你吧. 一个图像, 算你100MB了, 加上导入加上处理加上写入, 最多才消耗300MB而已嘛...
      

  2.   

    能给出明确的代码吗?是用CreateDIBSection吧?有更简便的方法吗?只保存像素点数据时,到时再逐个复制回原图?如果创新DIB,复制时也得逐个读取DIB吧?
      

  3.   

    谢谢你啊,我想等全部处理完再重新写回原来的图像数据中,因为细化需要分块处理才可以,所以不能直接写入,会出现裂痕之类的东西。我想再映射一个文件以存储细化后的像素数据,那个新映射的文件该如何创建?直接在磁盘上新建文件?映射方法是和你原来说的一样吧,最后得到个指针。还有就是为什么映射1.2G的图像时会出现pbFile为错误的指针呢,我还是搞不清呢?急求帮助
      

  4.   

    // 创建文件内核对象,其句柄保存于hFile 
    HANDLE hFile = CreateFile(
    lpszPathName,
    GENERIC_WRITE|GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING, //注意这里是打开现有的CREATE_ALWAYS新建
    FILE_FLAG_SEQUENTIAL_SCAN, 
    NULL);  
    用参数CREATE_ALWAYS替换OPEN_EXISTING,就是新建文件了。
    至于你说的“为什么映射1.2G的图像时会出现pbFile为错误的指针呢”
    这个正常情况下,肯定没问题,如果出错,肯定是你的CreateFileMapping和MapViewOfFile出错
    请搜索这个两个函数的用法,特别提示你申请映射空间的大小,这里可以申请64位的整数来表示的空间,所以函数表示空间大小的时候,用了两个32位整数参数来表示,也就是高位32位和低位32位,合在一起才是总空间大小,所以好好研究下吧,别申请错了。
      

  5.   

    我看了那几个函数的用法,也逐步调试了,发现在映射1.2G图像时,CreateFile和CreateFileMapping都返回了正确的句柄,而且申请的空间也是足够的,因为低32位就可以表示4G空间了,只是到函数MapViewOfFile时返回错误指针。能加个Q吗,联系方便。我的:472818342