vc实现 图片的大小改变 如800×600 改成 600×400请各位高手帮忙,最好有代码参考,谢谢

解决方案 »

  1.   

    对图像的操作还是找专门的类库为好,比如ximage,freeimage;
    方便、可靠、高效、而且有源代码;
      

  2.   

    补充一下,是保存时像素大小改变,而不是显示大小改变,Cimage不提供这个功能吧
      

  3.   

    http://topic.csdn.net/u/20070813/16/366c3a9c-c5fe-497b-a693-6c46bea37079.html
      

  4.   

    补充一下,是保存时像素大小改变?是不是24位图像变8位?设置位深度?CxImage是可以的
      

  5.   

    用GDI+转化,注意项目中要导入GDI+库
    #include <gdiPlus.h>
    using namespace Gdiplus;
    #pragma comment(lib, "gdiplus.lib")使用前要初始化GDI+环境
    GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
    推出时关闭资源
    GdiplusShutdown(gdiplusToken);int  TransPicture(LPCWSTR   lpSrcFile,LPCWSTR  lpDstExt,CStringW &strDstFile)           
    {   
    USES_CONVERSION;
    CFileFind   find;  
    #ifdef UNICODE

    if (!find.FindFile(lpSrcFile))//文件不存在 
    #else
    if (!find.FindFile(W2A(lpSrcFile)))//文件不存在  
    #endif {
    find.Close();
    return 0;
    }
    find.Close(); Image     *psrcImg=NULL;   
    psrcImg = Image::FromFile(lpSrcFile);
    if (!psrcImg || psrcImg->GetLastStatus() != Ok)
    {
    return 0;
    }
    int   srcWidth=psrcImg->GetWidth();   
    int   srcHeight=psrcImg->GetHeight();    //   Construct   a   Graphics   object   based   on   the   image.   
    //Graphics   imgGraphics(psrcImg);   
    int nSaveWidth=57;
    int nSaveHeight = 57;
    Bitmap   *pBitmap = ::new Bitmap(nSaveWidth,nSaveHeight);   
    Graphics   bmpGraphics(pBitmap);   
    //bmpGraphics.DrawImage(psrcImg,0,0,srcWidth,srcHeight);   
    bmpGraphics.DrawImage(psrcImg,RectF(0,0,nSaveWidth,nSaveHeight),0,0,srcWidth,srcHeight,UnitPixel);
    delete psrcImg;
    bmpGraphics.ReleaseHDC(NULL); //   Save   the   altered   image.
    LPWSTR   lpExt=PathFindExtensionW(lpSrcFile); 
    LPWSTR   lpExtDst = NULL; lpDstExt++; LPWSTR   lpEncoder;  
    switch(*lpDstExt)   
    {   
    case   L'J':   
    case   L'j':   
    lpEncoder=L"image/jpeg";   
    lpExtDst = L".jpeg";  
    break;   
    case   L'P':   
    case   L'p':   
    lpEncoder=L"image/png";   
    lpExtDst = L".png"; 
    break;   
    case   L'B':   
    case   L'b':   
    lpEncoder=L"image/bmp";  
    lpExtDst = L".bmp"; 
    break;   
    case   L'G':   
    case   L'g':   
    lpEncoder=L"image/gif";   
    lpExtDst = L".gif"; 
    break;   
    case   L't':   
    case   L'T':   
    lpEncoder=L"image/tiff";   
    lpExtDst = L".tiff"; 
    break;   
    default:   
    lpEncoder=L"image/jpeg";   
    lpExtDst = L".jpeg"; 
    }    CStringW strPicPath(lpSrcFile);
    CStringW strExt(lpExt);
    int nLen = strPicPath.Find(strExt);
    if(nLen>0)
    strPicPath=strPicPath.Left(nLen);
    strPicPath += lpExtDst; CLSID   imgClsid;   
    GetImageCLSID(lpEncoder,&imgClsid);
    Status statusSave = pBitmap->Save(strPicPath,&imgClsid,NULL);  DeleteFileW(lpSrcFile); //lpSrcFile = strPicPath.GetBuffer();
    //strPicPath.ReleaseBuffer();

    strDstFile = CStringW(strPicPath);
    ::delete pBitmap; return (statusSave == Ok )?1:0;
    }BOOL GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
    {
    UINT num = 0;
    UINT size = 0; ImageCodecInfo* pImageCodecInfo = NULL;
    GetImageEncodersSize(&num, &size);
    if(size == 0){
    return FALSE;
    }
    pImageCodecInfo = (ImageCodecInfo *)(malloc(size));
    if(pImageCodecInfo == NULL)
    return FALSE;
    GetImageEncoders(num, size, pImageCodecInfo);  // Find for the support of format for image in the windows
    for(UINT i = 0; i < num; ++i)

    //MimeType: Depiction for the program image  
    if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0)
    {  
    *pCLSID = pImageCodecInfo[i].Clsid; 
    free(pImageCodecInfo); 
    return TRUE;  
    }  
    }  
    free(pImageCodecInfo);  
    return FALSE; 
      

  6.   


    先resize到另外一个图像,然后再保存不就行了
      

  7.   

    双线插值缩放算法
    SOSO一下