最好不要用到GDI+。

解决方案 »

  1.   

    GetEnhMetaFile得到emf句炳然后PlayEnhMetaFile到dc上,然后将dc中的位图用GetDIBits转成dib,将dib写入文件就可以了。
      

  2.   

    EMF (Enhanced MetaFile) ——是在印刷工业中应用与Windows操作系统的文件格式。实际上EMF是原始WMF(Windows metafile)格式的32位版本。EMF格式的产生是为了解决WMF在印刷行业中的不足。EMF是设备独立性的一种格式,也就是说EMF可以始终保持着图形的精度,而无论用打印机打印出何种分辨率(dot/inch)的硬拷贝。而在网路上,较小的EMF格式可以节省带宽。
    如果你要将EMF格式转换成BMP格式,肯定要先了解EMF格式的,读出它的数据,然后写入位图格式中,最后create一个位图即可。网上有很多关于EMF的格式的,搜一下吧,如果找不着再发信给我,我给你发过去。
      

  3.   

    不用这么复杂吧?如果系统是2000及以上版本,那么可以使用系统自带的GDI+,可以实现任意格式图片的转换.
      

  4.   

    如果系统是2000及以上版本,那么可以使用系统自带的GDI+,可以实现任意格式图片的转换.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~请问那些函数能够转换?
      

  5.   

    int Tofile(HBITMAP hbitmap , LPSTR lpfilename)

    HDC hdc; //设备描述表
    int ibits; 
    WORD wbitcount;  //当前显示分辨率下每个像素所占字节数

    //位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数
    DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten; BITMAP bitmap; //位图属性结构
    BITMAPFILEHEADER bmfhdr; //位图文件头结构
    BITMAPINFOHEADER bi; //位图信息头结构
    LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 //定义文件,分配内存句柄,调色板句柄
    HANDLE fh, hdib, hpal,holdpal=NULL;
    //计算位图文件每个像素所占字节数
    hdc = CreateDC("display",NULL,NULL,NULL);
    ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
    DeleteDC(hdc); if (ibits <= 1)
    wbitcount = 1;
    else if (ibits <= 4)
    wbitcount = 4;
    else if (ibits <= 8)
    wbitcount = 8;
    else if (ibits <= 16)
    wbitcount = 16;
    else if (ibits <= 24)
    wbitcount = 24;
    else 
    wbitcount = 32; //计算调色板大小
    if (wbitcount <= 8)
    dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD); //设置位图信息头结构
    GetObject(hbitmap, sizeof(BITMAP), (LPSTR)&bitmap);
    bi.biSize = sizeof(LPBITMAPINFOHEADER);
    bi.biWidth = bitmap.bmWidth;
    bi.biHeight = bitmap.bmHeight;
    bi.biPlanes = 1;
    bi.biBitCount = wbitcount;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = 0;
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;
    bi.biClrImportant = 0; dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)* 4 * bitmap.bmHeight ;
    //为位图内容分配内存
    hdib = GlobalAlloc(GHND,dwbmbitssize + dwpalettesize + sizeof(BITMAPINFOHEADER));
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
    *lpbi = bi;

    // 处理调色板 
    hpal = GetStockObject(DEFAULT_PALETTE);
    if (hpal)
    {
    hdc = ::GetDC(NULL);
    holdpal = SelectPalette(hdc, (HPALETTE)hpal, false);
    RealizePalette(hdc);
    }

    // 获取该调色板下新的像素值
    GetDIBits(hdc, hbitmap, 0, (UINT) bitmap.bmHeight,(LPSTR)lpbi + 
    sizeof(BITMAPINFOHEADER)+dwpalettesize,(BITMAPINFO*)lpbi, DIB_RGB_COLORS);

    //恢复调色板 
    if (holdpal)
    {
    SelectPalette(hdc, (HPALETTE)holdpal, true);
    RealizePalette(hdc);
    ::ReleaseDC(NULL, hdc);
    } //创建位图文件 
    fh = CreateFile(lpfilename, GENERIC_WRITE, 0, NULL, 
    CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL);
    if (fh == INVALID_HANDLE_VALUE)
    return false;

    // 设置位图文件头
    bmfhdr.bfType = 0x4d42; // "bm"
    dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwpalettesize + dwbmbitssize; 
    bmfhdr.bfSize = dwdibsize;
    bmfhdr.bfReserved1 = 0;
    bmfhdr.bfReserved2 = 0;
    bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwpalettesize; // 写入位图文件头
    WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL);

    // 写入位图文件其余内容
    WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL);
    //清除 
    GlobalUnlock(hdib);
    GlobalFree(hdib);
    CloseHandle(fh);
    return true;
    }
      

  6.   

    关于GDI+里面图像转换,详细的请看这里:
    http://www.powerba.com/develop/vc/article/20020411001.htm
      

  7.   

    谁知道GDI到底支持多少图象格式? 支持PSD, PICT, PPM格式吗?
      

  8.   

    GDI+能转BMP to EMF?我试了好象不行
      

  9.   

    GetEnhMetaFile得到emf句炳然后PlayEnhMetaFile到dc上,然后将dc中的位图用GetDIBits转成dib,将dib写入文件就可以了。
    这个是我刚刚做过个程式(AnyDraw)里的一个小功能
    http://www.coolcol.com你可以先插入WMF或EMF,然后导出为BMP