oharad 2022-02-24 20:47 采纳率: 61.5%
浏览 211

c语言easyx旋转函数rotateimage的问题

转着转着就变成这样了(,各位有什么办法可以解决嘛,有没有自己写的旋转函数源代码啊

img

img

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-02-25 10:11
    关注

    仅供参考:

    #include <math.h>
    #include <string.h>
    #include <stdio.h>
    #include <windows.h>
    #include <gdiplus.h>
    #pragma comment(lib, "gdiplus.lib")
    using namespace Gdiplus;
    wchar_t formats[5][11]={
        L"image/bmp",
        L"image/jpeg",
        L"image/gif",
        L"image/tiff",
        L"image/png",
    };
    wchar_t exts[5][5]={
        L".bmp",
        L".jpg",
        L".gif",
        L".tif",
        L".png",
    };
    int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) {
       UINT  num = 0;          // number of image encoders
       UINT  size = 0;         // size of the image encoder array in bytes
       ImageCodecInfo* pImageCodecInfo = NULL;
       GetImageEncodersSize(&num, &size);
       if(size == 0) return -1;  // Failure
       pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
       if(pImageCodecInfo == NULL) return -1;  // Failure
       GetImageEncoders(num, size, pImageCodecInfo);
       for (UINT j = 0; j < num; ++j) {
          if ( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) {
             *pClsid = pImageCodecInfo[j].Clsid;
             free(pImageCodecInfo);
             return j;  // Success
          }
       }
       free(pImageCodecInfo);
       return -1;  // Failure
    }
    int wmain(int argc,wchar_t *argv[]) {
        int r=1;
        if (argc<4) {
        USAGE:
            wprintf(L"%s srcimg.{bmp|jpg|gif|tif|png|wmf|emf|ico}  desimg.{bmp|jpg|gif|tif|png}  angle\n",argv[0]);
            return r;
        }
        int i;
        for (i=0;i<5;i++) {
            if (0==_wcsicmp(argv[1]+wcslen(argv[1])-4,exts[i])) break;
        }
        if (i>=5) goto USAGE;
        for (i=0;i<5;i++) {
            if (0==_wcsicmp(argv[2]+wcslen(argv[2])-4,exts[i])) break;
        }
        if (i>=5) goto USAGE;
        GdiplusStartupInput gdiplusstartupinput;
        ULONG_PTR gdiplustoken;
        GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);
        {
            Image img(argv[1]);
            if (Ok==img.GetLastStatus()) {
                UINT height = img.GetHeight();
                UINT width  = img.GetWidth();
                REAL angle;
                if (1==swscanf_s(argv[3],L"%f",&angle)) {
                    REAL size;
                    size=(REAL)sqrt(1.0*width*width+1.0*height*height);
                    Matrix mat;
                    mat.Translate(size / -2.0f, size / -2.0f);
                    mat.Rotate(-angle, MatrixOrderAppend);
                    mat.Translate(size / 2.0f, size / 2.0f, MatrixOrderAppend);
                    PointF pfTL((size-width)/2.0f      ,(size-height)/2.0f       );
                    PointF pfTR((size-width)/2.0f+width,(size-height)/2.0f       );
                    PointF pfBL((size-width)/2.0f      ,(size-height)/2.0f+height);
                    PointF pfBR((size-width)/2.0f+width,(size-height)/2.0f+height);
                    Graphics tgp(&img);
                    Bitmap bmp((UINT)size,(UINT)size,&tgp);//Let bmp Resolution equal to img Resolution
                    Graphics gp(&bmp);
                    gp.SetTransform(&mat);
                    gp.DrawImage(&img,pfTL);
                    REAL xmin,ymin,xmax,ymax,x,y,rw,rh;
                    mat.TransformPoints(&pfTL);
                    xmin=xmax=pfTL.X;
                    ymin=ymax=pfTL.Y;
                    mat.TransformPoints(&pfTR);
                    if (xmin>pfTR.X) xmin=pfTR.X;
                    if (xmax<pfTR.X) xmax=pfTR.X;
                    if (ymin>pfTR.Y) ymin=pfTR.Y;
                    if (ymax<pfTR.Y) ymax=pfTR.Y;
                    mat.TransformPoints(&pfBL);
                    if (xmin>pfBL.X) xmin=pfBL.X;
                    if (xmax<pfBL.X) xmax=pfBL.X;
                    if (ymin>pfBL.Y) ymin=pfBL.Y;
                    if (ymax<pfBL.Y) ymax=pfBL.Y;
                    mat.TransformPoints(&pfBR);
                    if (xmin>pfBR.X) xmin=pfBR.X;
                    if (xmax<pfBR.X) xmax=pfBR.X;
                    if (ymin>pfBR.Y) ymin=pfBR.Y;
                    if (ymax<pfBR.Y) ymax=pfBR.Y;
                    x=xmin;
                    y=ymin;
                    rw=xmax-x;
                    rh=ymax-y;
                    Bitmap* clone;
                    clone = bmp.Clone(x,y,rw,rh,PixelFormat24bppRGB);//bmp.GetPixelFormat()
                    CLSID encoderClsid;
                    if (0<=GetEncoderClsid(formats[i],&encoderClsid)) {
                        if (Ok==clone->Save(argv[2],&encoderClsid)) {
                            wprintf(L"OK to %s  %s  %s  %s\n",argv[0],argv[1],argv[2],argv[3]);
                            r=0;
                        } else {
                            wprintf(L"Error to save %s\n",argv[2]);
                            r=4;
                        }
                    } else {
                        wprintf(L"Error to GetEncoderClsid(%s,...)\n",formats[i]);
                        r=3;
                    }
                    delete clone;
                } else {
                    wprintf(L"Error to get angle %s\n",argv[3]);
                    r=2;
                }
            } else {
                wprintf(L"Error to load %s\n",argv[1]);
                r=5;
            }
        }
        GdiplusShutdown(gdiplustoken);
        return r;
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 2月24日

悬赏问题

  • ¥15 asp写PC网站开通了微信支付,扫码付款不能跳转
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊