我正在尝试使用GDI+将旋转的图像居中到目标缓冲区。源缓冲区和目标缓冲区的大小不同。
源缓冲区的大小为图像数据的大小:(宽度,高度)。
目标缓冲区的大小是适合整个旋转图像的矩形大小:(旋转后的宽度,旋转后的高度)。
这是我正在尝试的代码:
// Calculate the size needed for the image to be rotated into
int width = /* some width */;
int height = /* some height */;
System::Windows::Size destSize
= IPMathUtilities::CalculateRotatedImageSize(rotateAreaBoundingPoints,
rotationDegree, width, height);
//
// Create source bitmap object
Bitmap^ sourceBitmap = gcnew Bitmap(width, height, width * 2,
PixelFormat::Format16bppRgb555, ptrSourceBuffer);
//
// Create destination bitmap object
int destBufferSize = destSize.Width * destSize.Height * 2;
BYTE* pDestBuffer = new BYTE[destBufferSize];
memset(pDestBuffer, 0, destBufferSize);
Bitmap^ destBitmap = gcnew Bitmap(destSize.Width, destSize.Height,
destSize.Width * 2, PixelFormat::Format16bppRgb555, (IntPtr)pDestBuffer);
//
// Draw rotated source image in destination image
Graphics^ g = Graphics::FromImage(destBitmap);
g->TranslateTransform(-width/2, -height/2);
g->RotateTransform(rotationDegree, MatrixOrder::Append);
g->TranslateTransform(destSize.Width / 2.0, destSize.Height / 2.0,
MatrixOrder::Append);
g->DrawImage(sourceBitmap, 0, 0, width, height);
这个几乎可以工作。它很接近 - 我发现如果高度大于宽度,则旋转图像的左侧位置不正确。同样,如果宽度大于高度,则旋转图像的顶部位置不正确。
一些注意事项:
- IPMathUtilities是我编写的实用程序类。 - 我非常确定IPMathUtilities :: CalculateRotatedImageSize()计算出了适合整个旋转图像所需的矩形的正确大小。我百分之百确定。我已经彻底测试过它,它有效。 - 我最近问了一个类似的问题:为什么iplRotate()没有给我正确的结果?。最后我放弃了IPL / IPP并尝试使用GDI +。
有什么想法吗?