谢谢

解决方案 »

  1.   

    见到的都是自己写或用别人的类,用Serialize的还没见过。这是VISUAL C++数字图像处理上的,供参考:
    /*************************************************************************
    *
    * 函数名称:
    *   SaveDIB()
    *
    * 参数:
    *   HDIB hDib          - 要保存的DIB
    *   CFile& file        - 保存文件CFile
    *
    * 返回值:
    *   BOOL               - 成功返回TRUE,否则返回FALSE或者CFileException
    *
    * 说明:
    *   该函数将指定的DIB对象保存到指定的CFile中。该CFile由调用程序打开和关闭。
    *
    *************************************************************************/
    BOOL WINAPI SaveDIB(HDIB hDib, CFile& file)
    {
    // Bitmap文件头
    BITMAPFILEHEADER bmfHdr;

    // 指向BITMAPINFOHEADER的指针
    LPBITMAPINFOHEADER lpBI;

    // DIB大小
    DWORD dwDIBSize;

    if (hDib == NULL)
    {
    // 如果DIB为空,返回FALSE
    return FALSE;
    }

    // 读取BITMAPINFO结构,并锁定
    lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);

    if (lpBI == NULL)
    {
    // 为空,返回FALSE
    return FALSE;
    }

    // 判断是否是WIN3.0 DIB
    if (!IS_WIN30_DIB(lpBI))
    {
    // 不支持其它类型的DIB保存

    // 解除锁定
    ::GlobalUnlock((HGLOBAL) hDib);

    // 返回FALSE
    return FALSE;
    }

    // 填充文件头

    // 文件类型"BM"
    bmfHdr.bfType = DIB_HEADER_MARKER;

    // 计算DIB大小时,最简单的方法是调用GlobalSize()函数。但是全局内存大小并
    // 不是DIB真正的大小,它总是多几个字节。这样就需要计算一下DIB的真实大小。

    // 文件头大小+颜色表大小
    // (BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个DWORD都是该结构的大小)
    dwDIBSize = *(LPDWORD)lpBI + ::PaletteSize((LPSTR)lpBI);

    // 计算图像大小
    if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))
    {
    // 对于RLE位图,没法计算大小,只能信任biSizeImage内的值
    dwDIBSize += lpBI->biSizeImage;
    }
    else
    {
    // 象素的大小
    DWORD dwBmBitsSize;

    // 大小为Width * Height
    dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * lpBI->biHeight;

    // 计算出DIB真正的大小
    dwDIBSize += dwBmBitsSize;

    // 更新biSizeImage(很多BMP文件头中biSizeImage的值是错误的)
    lpBI->biSizeImage = dwBmBitsSize;
    }


    // 计算文件大小:DIB大小+BITMAPFILEHEADER结构大小
    bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);

    // 两个保留字
    bmfHdr.bfReserved1 = 0;
    bmfHdr.bfReserved2 = 0;

    // 计算偏移量bfOffBits,它的大小为Bitmap文件头大小+DIB头大小+颜色表大小
    bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize
    + PaletteSize((LPSTR)lpBI);
    // 尝试写文件
    TRY
    {
    // 写文件头
    file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));

    // 写DIB头和象素
    file.WriteHuge(lpBI, dwDIBSize);
    }
    CATCH (CFileException, e)
    {
    // 解除锁定
    ::GlobalUnlock((HGLOBAL) hDib);

    // 抛出异常
    THROW_LAST();
    }
    END_CATCH

    // 解除锁定
    ::GlobalUnlock((HGLOBAL) hDib);

    // 返回TRUE
    return TRUE;
    }
      

  2.   

    可以用Serialize(CArchive& ar)来保存图象吗?
    关注ing..............
      

  3.   

    wrcluomo(落木:
    首先谢谢,那么按你的代码 ,各种格式的图象的保存,都可以吗
      

  4.   

    当然不是了,他这个只能保存位图的
    想保存jpeg和gif等就困难了,还是去找现成的代码
      

  5.   

    修改Serialize(CArchive& ar)的方法不知道的
    但是,如 herrycsdn(卓一凡) 兄所讲
    只要针对不同的文件格式,了解他们的文件内部结构
    对其结构进行描述就可以了
    比如dib就是对文件信息头改写一下就好了
    关键是文件的内部结构
      

  6.   

    我收藏了一个介绍各种图象格式的帖子,或许会有用:
    http://expert.csdn.net/Expert/topic/1151/1151880.xml?temp=.8853571
      

  7.   

    crazy_lazy_pig(疯狂懒猪),呵呵,你的那个帖子好像已经不在了
      

  8.   

    呵呵,谁说不在了,不注意看网页提示,看到错误信息就说电脑坏了,你真是菜鸟吗?
    算了,我教你吧,试试这个网址吧:
    http://search.csdn.net/expert/topic/50/5010/2002/11/6/1151880.htm
      

  9.   

    crazy_lazy_pig(疯狂懒猪):呵呵,真是大意了,不好意思,就是个十足菜鸟:)
    图像格式的内部结构知道了,就根据图像数据的信息(比如说大小,长宽,数据存放起始地址等等)写入特定图像的数据结构,至于是什么数据结构就依据图像格式而定了,利用vc++中最基本的CFile类就能对文件进行读写操作了,这个任意一本书上都会有的: )  (板门弄斧...)
      

  10.   

    可以,在serialize函数中按顺序依次读写bmp对象的各部分数据就可以了。