小弟是一个VC初学者,现在学习利用VC进行一些简单的图像处理,书上有一种方法,但是我试试了好多次都没有成功,所以现在在这里请教各位达人了,能不能给小弟一个简单实例(编译可以通过的),谢谢达人们了!
小弟在此跪谢大家了!

解决方案 »

  1.   

    你还需要在视中可以修改这个BMP吗?
      

  2.   

    to:code8238(二进制动物)
    是呀,还要对这副图像进行一些处理后,保存!老大你有源代码吗??能够发给我吗??
    谢谢了!我的QQ:69965868
    谢谢了,你给我吗??
    期待…………中………………
      

  3.   

    LoadBitmap就可以了,你也可以在内存中创建内存图像,然后再和LoadBitmap的图片关联起来
      

  4.   

    http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=701
    随便一个都可以!!
      

  5.   

    /这部分是存储DIB的过程
    BOOL WINAPI SaveDIB(HDIB hDib,CFile& file)
    {
    BITMAPFILEHEADER bmfile;
    LPBITMAPINFOHEADER lpBI;
    DWORD dwDIBSize;
    if(hDib==NULL)
    {
    return FALSE;
    } lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib); 

    if(lpBI==NULL)
    {
    return FALSE;
    }
        
    if(!IS_WIN30_DIB(lpBI))
    {
    //我在这里只是提供了WIN30格式的DIB保存,其他格式的就退出了
    ::GlobalUnlock((HGLOBAL)hDib);
    return FALSE;
    }
    bmfile.bfType=DIB_HEADER_MARKER;  //我前面的那个宏定义,即BM;

    //这里本身可以用GLOBALSIZE函数直接求出DIB大小,因为我的全局内存部分总是多
    //几个字节,所以用BITMAPINFOHEADER 中BISIZE即这个结构的大小,加上我定义的API函数
        //求的PALETTE大小
    dwDIBSize=*(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI);
        //剩下加上图像的实际占用内存,分两种情况
    if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))
    {
    dwDIBSize+=lpBI->biSizeImage;
    }
    else
    {
    dwDIBSize+=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
    //其实很多bmp文件头中的SIZEIMAGINE都是错误的,所以这里重新填写
            lpBI->biSizeImage=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
        }

        bmfile.bfSize=sizeof(BITMAPFILEHEADER)+dwDIBSize; 
    bmfile.bfReserved1=0;
    bmfile.bfReserved2=0;
    bmfile.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+PaletteSize((LPSTR)lpBI);   //写文件的时候我用到TRY和CATCH块
    TRY
    {
    file.Write((LPSTR)&bmfile,sizeof(BITMAPFILEHEADER));
    file.WriteHuge(lpBI,dwDIBSize);   //这个函数用于写大于64KB字节的数据 
    }
    CATCH (CFileException,e)
    {
    ::GlobalUnlock((HGLOBAL)hDib);
    THROW_LAST();
    }
    END_CATCH; ::GlobalUnlock((HGLOBAL)hDib);
    return TRUE;
    }
    //读取文件的操作
    HDIB WINAPI ReadDIBFile(CFile& file)
    {
    BITMAPFILEHEADER bmfHeader;
    DWORD dwBitsSize;
    HDIB hDIB;
    LPSTR pDIB; dwBitsSize=file.GetLength();
    if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader))
    {
    return NULL;
    } if(bmfHeader.bfType!=DIB_HEADER_MARKER)
    {
    return NULL;
    } //为DIB分配内存
    hDIB=(HDIB)::GlobalAlloc (GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);
    if(hDIB==0)
    {
    return NULL;
    }
        //锁定句柄
    pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
    //开始读取数据 
    if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER))
    {
    ::GlobalUnlock((HGLOBAL)hDIB);
    ::GlobalFree((HGLOBAL)hDIB);
    return NULL;
    } ::GlobalUnlock((HGLOBAL)hDIB);
    return hDIB;
    }
    BOOL CImageDoc::OnOpenDocument(LPCTSTR lpszPathName) 
    {


    CFile file;
        CFileException fe;   //打开文件错误类
        //下面这个函数REPORT....是MFC特有的,我挖出来因为它省略了我自己CATCH各种错误时
    //不必要的自定义报错方式.第三个参数为TRUE时,是存储用的,反之是读取用到的,最后一个
    //是书上给的
    //OPEN函数的第三个参数是打开错误类的地址
    if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite,&fe))
    {
    ReportSaveLoadException (lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC); //RETURN FALSE
        return FALSE;
    }
    DeleteContents();    
        BeginWaitCursor();
    TRY

    m_hDIB=::ReadDIBFile(file);
    }
    //第二参数的帮助文档说明,是个指针名字exception_object_pointer_name
    CATCH(CFileException,eLoad )
    {
    file.Abort();
    EndWaitCursor();
    ReportSaveLoadException(lpszPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
    m_hDIB=NULL;
    return FALSE;
    }
    END_CATCH;    //初始化DIB
    InitDIBData(); //如果图像句柄为空,弹出对话框
    if(m_hDIB==NULL)
    {
    AfxMessageBox("读取文件出错,该程序不支持此类型");return FALSE;
    } SetPathName(lpszPathName);  
        SetModifiedFlag (FALSE);    

        return TRUE;
    }void CImageDoc::OnFileOpen() 
    {
    if(IsModified())
    {
    if(MessageBox(NULL,"reopen failed","system hint",MB_ICONQUESTION|MB_YESNO)==IDNO)
    {
    return;
    }
    }
    CFile file;
    CFileException fe;
    CString strPathName=GetPathName ();
        if(!file.Open(strPathName,CFile::modeRead|CFile::shareDenyWrite,&fe))
    {
    ReportSaveLoadException(strPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
    return;
    }
    BeginWaitCursor();
    TRY
    {
    m_hDIB=::ReadDIBFile(file);
    }
    CATCH(CFileException,eLoad)
    {
    file.Abort();
    EndWaitCursor();
    ReportSaveLoadException(strPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
    m_hDIB=NULL;
    return;
    }
    END_CATCH;
    InitDIBData();
    if(m_hDIB==NULL)
    {
    CString strMsg;
    strMsg="读取文件出错,可能不支持该类型的图像文件";
    MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
    EndWaitCursor();
    return;
    }
    SetModifiedFlag(FALSE);
    UpdateAllViews(NULL);
    EndWaitCursor();
    return;
    }
    BOOL CImageDoc::OnSaveDocument(LPCTSTR lpszPathName) 
    {   
    CFile file;
        CFileException fe;     //注意这里用REPORT函数的时候把FALSE改为TRUE
    if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe))
    {
    ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FILENAME);
        return FALSE;
    }

    BOOL m_bSuccess=FALSE;
    TRY
    {
    BeginWaitCursor();
    m_bSuccess=::SaveDIB(m_hDIB,file);
    file.Close();
    }
    CATCH (CException,eSave)   //这里的类编程了CEXCEPTION
    {
    //这是变成写指针
    file.Abort();
    EndWaitCursor();
    ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC);
    return FALSE;
    }
    END_CATCH; EndWaitCursor();
    SetModifiedFlag(FALSE);

    if(!m_bSuccess)  AfxMessageBox("无法保存BMP图像!!!!");
    return m_bSuccess; 
    }