转着转着就变成这样了(,各位有什么办法可以解决嘛,有没有自己写的旋转函数源代码啊
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
悬赏问题
- ¥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软件有没有人能远程安装啊