CImage处理的一个函数(包含缩放、旋转、翻转)

#include <atlimage.h>

/*
[input]
Image: source image,
szNew: size of new image, 
nRotate: 0=no rotate, 1=rotate 90 left, 2=rotate 90 right, 3=rotate 180 upside down
nFlip: 0=no flip, 1=horizontal, 2=vertical
bNegative: true=film like negative image
[return]
pointer to new cimage
*/
CImage* EditImage(CImage& Image, CSize szNew, int nRotate, int nFlip, bool bNegative){

    //get the scale rate
    float fX, fY;
    if (nRotate == 1 || nRotate == 2){
        fX = szNew.cy / (float)Image.GetWidth();
        fY = szNew.cx / (float)Image.GetHeight();
    }
    else{
        fX = szNew.cx / (float)Image.GetWidth();
        fY = szNew.cy / (float)Image.GetHeight();
    }    

    //create new cimage
    CImage* pImage = new CImage;
    pImage->Create(szNew.cx, szNew.cy, 24);

    for (int y = 0; y < szNew.cy; y++){        
        int y0 = y;
        if (nFlip == 2)
            y0 = szNew.cy - y - 1;
        int y1 = y0;
        for (int x = 0; x < szNew.cx; x++){
            int x0 = x;
            if (nFlip == 1)
                x0 = szNew.cx - x - 1;
            int x1 = x0;
            if (nRotate == 1){
                x1 = szNew.cy - y0 - 1;
                y1 = x0;
            }
            else if (nRotate == 2){
                x1 = y0;
                y1 = szNew.cx - x0 - 1;
            }
            else if (nRotate == 3){
                x1 = szNew.cx - x - 1;
                y1 = szNew.cy - y - 1;
                if (nFlip == 1)
                    x1 = x;
                else if (nFlip == 2)
                    y1 = y;
            }
            
            //get the source image's pixel value
            int xs = x1 / fX;
            int ys = y1 / fY;
            byte *ps = (byte*)Image.GetPixelAddress(xs, ys);
            
            //nearest neighbour, or biliner for better result
            byte *p = (byte*)pImage->GetPixelAddress(x, y);
            if (bNegative){
                *p = 255 - *ps;
                *(p + 1) = 255 - *(ps + 1);
                *(p + 2) = 255 - *(ps + 2);
            }
            else{
                *p = *ps;
                *(p + 1) = *(ps + 1);
                *(p + 2) = *(ps + 2);
            }
        }
    }
    return pImage;
}

void Test(){
      CImage image;
      image.Load(L"myimage.png");
      CImage* pNewImage=EditImage(image,CSize(800,600),3,0,false);
      pNewImage->Save(L"newimage.jpg",Gdiplus::ImageFormatJPEG);  //Gdiplus::ImageFormatPNG Gdiplus::ImageFormatBMP...JPEG GIF
      pNewImage->Destroy();
      delete pNewImage;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值