void ljb_cv_rotate_buf_size(IplImage *imgSrc, double degree, int *w_dst, int *h_dst)
{    
    double angle, a, b;
    int    w_src, h_src;

    angle = degree  * CV_PI / 180.;
    a = sin(angle), b = cos(angle); 

    w_src = imgSrc->width;
    h_src = imgSrc->height;

    *w_dst = (int)(h_src * fabs(a) + w_src * fabs(b));
    *h_dst = (int)(w_src * fabs(a) + h_src * fabs(b));
}

void ljb_cv_rotate(IplImage *imgSrc, IplImage *imgDst, double degree)
{    
    double angle, a, b;
    int    w_src, h_src, w_dst, h_dst;
    double map[6];
    CvMat  map_matrix = cvMat(2, 3, CV_64FC1, map);
    CvPoint2D32f pt = {0};

    angle = degree  * CV_PI / 180.; 
    a = sin(angle), b = cos(angle); 

    w_src = imgSrc->width;
    h_src = imgSrc->height;

    w_dst = imgDst->width;
    h_dst = imgDst->height;

    pt = cvPoint2D32f(w_src / 2, h_src / 2);
    cv2DRotationMatrix(pt, degree, 1.0, &map_matrix);//旋转中心,角度,尺度,生成2*3旋转矩阵

    // Adjust rotation center to dst's center,
    // otherwise you will get only part of the result
    map[2] += (w_dst - w_src) / 2;
    map[5] += (h_dst - h_src) / 2;

    cvWarpAffine(
        imgSrc, 
        imgDst,
        &map_matrix,
        CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,
        cvScalarAll(0)
        );  
}
    IplImage* img = cvLoadImage("E:\\bgtest.bmp", CV_LOAD_IMAGE_GRAYSCALE);     
    IplImage* dst = NULL;
    int dstWidth, dstHeight = 0;
    IplImage* imgRotate = NULL;
    CvSize cvsize = {0};
    
    ljb_cv_rotate_buf_size(img, 45, &dstWidth, &dstHeight);
    cvsize.width = dstWidth;
    cvsize.height = dstHeight;
    imgRotate = cvCreateImage(cvsize, IPL_DEPTH_8U, 1);
    cvZero(imgRotate);
    ljb_cv_rotate(img, imgRotate, 45);
     cvSaveImage("E:\\saltsingle3000.bmp",imgRotate);

理解可参考: 

http://blog.csdn.net/xiaowei_cqu/article/details/7616044

http://blog.csdn.net/augusdi/article/details/9022719