如何在vc++中旋轉(zhuǎn)位圖

字號:

第一步,你必須知道位圖即BMP格式的文件的結(jié)構(gòu).
    位圖(bmp)文件由以下幾個部分組成:
    1.BITMAPFILEHEADER,它的定義如下:
    typedef struct tagBITMAPFILEHEADER
    {
    WORD  bfType;     //必須為’BM’
    DWORD  bfSize;     //文件大小
    WORD  bfReserved1; //必須為0
    WORD  bfReserved2; //必須為0
    DWORD  bfOffBits;  //從ITMAPFILEHEADER到存放bmp數(shù)據(jù)的偏移量                 
    } BITMAPFILEHEADER, *PBITMAPFILEHEADER;
    2.BITMAPINFOHEADER,它的定義如下:
    typedef struct tagBITMAPINFOHEADER
    {
    DWORD biSize; //此結(jié)構(gòu)的大小,可用sizeof(BITMAPINFOHEAER)得到
    LONG  biWidth; //位圖寬度,以象素為單位
    LONG  biHeight; //位圖高度,以象素為單位
    WORD  biPlanes; //必須為1
    WORD  biBitCount;//位圖象素位數(shù),可為0,1,4,8,24,32
    DWORD biCompression;
    DWORD biSizeImage; //(僅用于壓縮)
    LONG  biXPelsPerMeter; //一米橫向象素數(shù)
    LONG  biYPelsPerMeter; //一米縱向象素數(shù)
    DWORD biClrUsed;// (非零用語短顏色表)
    DWORD biClrImportant;
    } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
    由于以上信息可以直接從MSDN上查到,所以只做簡單介紹,你可以自己查看NSDN幫助,上面有很詳細(xì)的介紹.
    3.DIB位圖像.這里放的是真正的位圖數(shù)據(jù).
    知道了位圖的存放格式,下面我們就可以很容易的把它讀如內(nèi)存.
    第二步,讀入bmp圖像
    LPCTSTR lpszFileName4="untitled.bmp";  //文件路徑
    CFile file;                   //用于讀取BMP文件
    BITMAPFILEHEADER bfhHeader;//bmp文件頭
    BITMAPINFOHEADER bmiHeader; //bmp格式頭
    LPBITMAPINFO lpBitmapInfo;  //bmp格式具體信息
    int bmpWidth=0;             //圖片寬度
    int bmpHeight = 0;           //圖片高度      
    if(!file.Open(lpszFileName,CFile::modeRead))
    return ;               //打開文件
    file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));//讀取文件頭
    if(bfhHeader.bfType!=((WORD) (’M’<<8)|’B’))      //判斷是否是"BM"
    return ;
    if(bfhHeader.bfSize!=file.GetLength())
    return ;
    if (file.Read((LPSTR)&bmiHeader, sizeof(bmiHeader)) != sizeof(bmiHeader))
    return ;
    bmpHeight = bmiHeader.biHeight;//得到高度和寬度
    bmpWidth = bmiHeader.biWidth;
    file.SeekToBegin();
    file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));
    UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
    lpBitmapInfo=(LPBITMAPINFO) new BYTE[uBmpInfoLen];
    file.Read((LPVOID) lpBitmapInfo,uBmpInfoLen);
    if((* (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))
    return ;
    DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits;
    LPVOID lpSrcBits=new BYTE[dwBitlen];     //將數(shù)據(jù)讀入lpSrcBits數(shù)組
    file.ReadHuge(lpSrcBits,dwBitlen);
    file.Close();                           //關(guān)閉文件