gpt4 book ai didi

c++ - winapi中的位图旋转

转载 作者:行者123 更新时间:2023-11-30 04:28:55 65 4
gpt4 key购买 nike

我有一个 BitMap(一个小 Sprite ),我必须以特定角度旋转它。我找到了这段代码,并尝试根据我的应用程序对其进行调整,但它似乎不起作用。 Sprite 根本不旋转,而是移动了一点。

函数代码如下:

void Sprite::Rotate(float radians, const char* szImageFile)
{
// Create a memory DC compatible with the display
HDC sourceDC, destDC;
sourceDC = CreateCompatibleDC( mpBackBuffer->getDC() );
destDC = CreateCompatibleDC( mpBackBuffer->getDC() );

// Get logical coordinates
HBITMAP hBitmap = (HBITMAP)LoadImage(g_hInst, szImageFile, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
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(mpBackBuffer->getDC(), w, h);

HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC, hBitmap );
HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC, hbmResult );

// Draw the background color before we change mapping mode
HBRUSH hbrBack = CreateSolidBrush( mcTransparentColor );
HBRUSH hbrOld = (HBRUSH)::SelectObject( destDC, hbrBack );
PatBlt( destDC, 0, 0, w, h, PATCOPY);
::DeleteObject( ::SelectObject( destDC, hbrOld ) );




// We will use world transform to rotate the bitmap
SetGraphicsMode(destDC, 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, &xform );

// Now do the actual rotating - a pixel at a time
BitBlt(destDC, 0, 0, w, h, sourceDC, 0, 0, SRCCOPY );
// Restore DCs
::SelectObject( sourceDC, hbmOldSource );
::SelectObject( destDC, hbmOldDest );

BITMAP btm;
::GetObject( hbmResult, sizeof( mImageBM ), &mImageBM );

}

我不明白为什么它不旋转图像,而是移动图像。此外,如果您知道另一种方法来执行此操作,我愿意接受建议,但请记住,我只能使用 winapi,不能使用其他库,而且我是 Windows 编程的初学者。

编辑:这是我得到代码的地方:http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1743/ .我不得不稍微改变一下,但我不认为这是因为那个,我只是将 CDC 更改为 HDC。我忽略的一件重要事情是 (0, 0) 坐标。因为该代码中的图像被认为是在角落里,但在我的应用程序中它位于 Sprite 的中心。即使这是一个问题,我认为这是计算位图新尺寸的问题,我看不出与旋转的联系。

最佳答案

如果位图在移动,在我看来 worldtransform 和 blit 都有效。
它移动的量是由于变换的 eDx/eDy 参数造成的吗?
是否只是对“旋转”示例中的值进行硬编码 here做出改变?正弦以相反的符号传递。所以它可能只是忽略了变换的旋转部分而只做了平移。

关于c++ - winapi中的位图旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754589/

65 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com