怎么使位图旋转90?

dingshanwei123 2014-01-07 09:38:36
CPoint Pt[3];

Pt[0].x = 384;

Pt[0].y = 0;

Pt[1].x = 384;

Pt[1].y = 640;

Pt[2].x = 0;

Pt[2].y = 0 ;
CBitmap bm;
ZeroMemory(&bm,sizeof(bm));
PlgBlt(hThisDC, Pt, hBkDC, 0, 0, 640,384, bm, 0, 0);
想用plgBlt来旋转,但是这个Pt不好设置,到底怎么转90度呢?而且第一个参数只能是窗口dc,换成其他的怎么不行?
...全文
341 点赞 收藏 8
写回复
8 条回复
dingshanwei123 2014年01月07日
引用 6 楼 worldy 的回复:
实际这个函数只需要将旋转参数设置清楚,应该还是比较好用的 Pt,需要三个单元,假设顺时针转90度 1,对应左上角旋转后的位置,你要转90度,则可以设置为右上角坐标 2,右上角旋转后的位置,则设置为右下角坐标 3,左下角旋转后的位置,则设置为左上角坐标 当然要保持原图的纵横比例,则需要对上述三个参数做适当调整 也可以使用 SetWorldTransform+ModifyWorldTransform+BitBlt
HBITMAP GetRotatedBitmapNT( HBITMAP hBitmap, float radians, COLORREF clrBack ) { // Create a memory DC compatible with the display CDC sourceDC, destDC; sourceDC.CreateCompatibleDC( NULL ); destDC.CreateCompatibleDC( NULL ); // Get logical coordinates BITMAP bm; ::GetObject( hBitmap, sizeof( bm ), &bm ); float cosine = (float)cos(radians); float sine = (float)sin(radians); // Compute dimensions of the resulting bitmap // First get the coordinates of the 3 corners other than origin int x1 = (int)(bm.bmHeight * sine); int y1 = (int)(bm.bmHeight * cosine); int x2 = (int)(bm.bmWidth * cosine + bm.bmHeight * sine); int y2 = (int)(bm.bmHeight * cosine - bm.bmWidth * sine); int x3 = (int)(bm.bmWidth * cosine); int y3 = (int)(-bm.bmWidth * sine); int minx = min(0,min(x1, min(x2,x3))); int miny = min(0,min(y1, min(y2,y3))); int maxx = max(0,max(x1, max(x2,x3))); int maxy = max(0,max(y1, max(y2,y3))); int w = maxx - minx; int h = maxy - miny; // Create a bitmap to hold the result HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), w, h); HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap ); HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult ); // Draw the background color before we change mapping mode HBRUSH hbrBack = CreateSolidBrush( clrBack ); HBRUSH hbrOld = (HBRUSH)::SelectObject( destDC.m_hDC, hbrBack ); destDC.PatBlt( 0, 0, w, h, PATCOPY ); ::DeleteObject( ::SelectObject( destDC.m_hDC, hbrOld ) ); // We will use world transform to rotate the bitmap SetGraphicsMode(destDC.m_hDC, GM_ADVANCED); XFORM xform; xform.eM11 = cosine; xform.eM12 = -sine; xform.eM21 = sine; xform.eM22 = cosine; xform.eDx = (float)-minx; xform.eDy = (float)-miny; SetWorldTransform( destDC.m_hDC, &xform ); // Now do the actual rotating - a pixel at a time destDC.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY ); // Restore DCs ::SelectObject( sourceDC.m_hDC, hbmOldSource ); ::SelectObject( destDC.m_hDC, hbmOldDest ); return hbmResult; } angle= (90/180.0)*3.14159; HBITMAP hBitmap=GetRotatedBitmapNT(hBitmap1,angle,NULL); 这样旋转后,原图都被改变了,深度不同了,也变成一个光板了,咋回事?
回复 点赞
worldy 2014年01月07日
实际这个函数只需要将旋转参数设置清楚,应该还是比较好用的 Pt,需要三个单元,假设顺时针转90度 1,对应左上角旋转后的位置,你要转90度,则可以设置为右上角坐标 2,右上角旋转后的位置,则设置为右下角坐标 3,左下角旋转后的位置,则设置为左上角坐标 当然要保持原图的纵横比例,则需要对上述三个参数做适当调整 也可以使用 SetWorldTransform+ModifyWorldTransform+BitBlt
回复 点赞
dingshanwei123 2014年01月07日
引用 4 楼 tiger9991 的回复:
链接 GDI+中有直接的的接口的。 GDI要自己写算法。
HBITMAP GetRotatedBitmapNT( HBITMAP hBitmap, float radians, COLORREF clrBack ) { // Create a memory DC compatible with the display CDC sourceDC, destDC; sourceDC.CreateCompatibleDC( NULL ); destDC.CreateCompatibleDC( NULL ); // Get logical coordinates BITMAP bm; ::GetObject( hBitmap, sizeof( bm ), &bm ); float cosine = (float)cos(radians); float sine = (float)sin(radians); // Compute dimensions of the resulting bitmap // First get the coordinates of the 3 corners other than origin int x1 = (int)(bm.bmHeight * sine); int y1 = (int)(bm.bmHeight * cosine); int x2 = (int)(bm.bmWidth * cosine + bm.bmHeight * sine); int y2 = (int)(bm.bmHeight * cosine - bm.bmWidth * sine); int x3 = (int)(bm.bmWidth * cosine); int y3 = (int)(-bm.bmWidth * sine); int minx = min(0,min(x1, min(x2,x3))); int miny = min(0,min(y1, min(y2,y3))); int maxx = max(0,max(x1, max(x2,x3))); int maxy = max(0,max(y1, max(y2,y3))); int w = maxx - minx; int h = maxy - miny; // Create a bitmap to hold the result HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), w, h); HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap ); HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult ); // Draw the background color before we change mapping mode HBRUSH hbrBack = CreateSolidBrush( clrBack ); HBRUSH hbrOld = (HBRUSH)::SelectObject( destDC.m_hDC, hbrBack ); destDC.PatBlt( 0, 0, w, h, PATCOPY ); ::DeleteObject( ::SelectObject( destDC.m_hDC, hbrOld ) ); // We will use world transform to rotate the bitmap SetGraphicsMode(destDC.m_hDC, GM_ADVANCED); XFORM xform; xform.eM11 = cosine; xform.eM12 = -sine; xform.eM21 = sine; xform.eM22 = cosine; xform.eDx = (float)-minx; xform.eDy = (float)-miny; SetWorldTransform( destDC.m_hDC, &xform ); // Now do the actual rotating - a pixel at a time destDC.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY ); // Restore DCs ::SelectObject( sourceDC.m_hDC, hbmOldSource ); ::SelectObject( destDC.m_hDC, hbmOldDest ); return hbmResult; } 用这个函数吗?我的原图是一个单色位图,float radians, COLORREF clrBack ,分别怎么传?90,0?
回复 点赞
傻X 2014年01月07日
链接 GDI+中有直接的的接口的。 GDI要自己写算法。
回复 点赞
dingshanwei123 2014年01月07日
没人知道吗?帮帮忙
回复 点赞
dingshanwei123 2014年01月07日
我知道这个函数怎么用,但是还要设置坐标点太机械化了,还有怎么hdcDest 目的:设备场景句柄图像 怎么不能设置到其他新建的dc上?因为后面还要使用这个句柄。 HDC RhBkDC; PlgBlt(RhBkDC, Pt, hBkDC, 0, 0, 640,384, bm, 0, 0); 这样就失败,句柄错误。
回复 点赞
boylafong 2014年01月07日
PlgBlt 参数说明: hdcDest 目的:设备场景句柄图像 lpPoint 目的:PointAPI 结构的数组,指定了图像放置区的位置和大小 hdcSrc 源:设备场景句柄 nXSrc 源:复制区起点 x 坐标 nYSrc 源:复制区起点 y 坐标 nWidth 源:复制区宽度 nHeight 源:复制区高度 hbmMask 掩码(屏蔽)用单色位图的句柄 xMask 单色位图左上角的 X 坐标 yMask 单色位图左上角的 Y 坐标
回复 点赞
dingshanwei123 2014年01月07日
求问题解决方案
回复 点赞
发动态
发帖子
图形处理/算法
创建于2007-09-28

7612

社区成员

5.0w+

社区内容

VC/MFC 图形处理/算法
社区公告
暂无公告