gpt4 book ai didi

image-processing - 如何使用 GDI+ 将旋转图像居中?

转载 作者:行者123 更新时间:2023-12-04 15:05:36 24 4
gpt4 key购买 nike

我正在尝试使用 GDI+ 将旋转图像居中到目标缓冲区中。源缓冲区和目标缓冲区大小不同。

源缓冲区是图像数据的大小:(宽度,高度)。
目标缓冲区是适合 所需的矩形的大小。整个旋转图像:(rotatedWidth,rotatedHeight)。

这是我正在尝试的代码:

// 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是我写的一个实用类。
  • 我 100% 肯定 IPMathUtilities::CalculateRotatedImageSize()计算适合整个旋转图像所需的矩形的正确大小。 100%确定。我已经彻底测试过它并且它有效。
  • 我最近问了一个类似的问题:Why is iplRotate() not giving me correct results? .我最终放弃了 IPL/IPP 并尝试了 GDI+。

  • 有任何想法吗?

    最佳答案

    旋转后,首先将图像移回原始位置,然后新 Canvas 变大一半。如果您在CalculateRotatedImageSize 中的计算确实正确,那么它应该完全适合。刚刚测试了这段代码,它似乎有效:

    g.TranslateTransform((float)(org.Width / -2), (float)(org.Height / -2));
    g.RotateTransform(45, System.Drawing.Drawing2D.MatrixOrder.Append );
    g.TranslateTransform((float)(org.Width / 2), (float)(org.Height / 2), System.Drawing.Drawing2D.MatrixOrder.Append);
    g.TranslateTransform((float)((rotated.Width - org.Width) / 2), (float)((rotated.Height - org.Height) / 2), System.Drawing.Drawing2D.MatrixOrder.Append);

    编辑:对不起,当然
    g.TranslateTransform((float)(org.Width / 2), (float)(org.Height / 2), System.Drawing.Drawing2D.MatrixOrder.Append);
    g.TranslateTransform((float)((rotated.Width - org.Width) / 2), (float)((rotated.Height - org.Height) / 2), System.Drawing.Drawing2D.MatrixOrder.Append);

    真的一样
    g.TranslateTransform((float)(rotated.Width / 2), (float)(rotated.Height / 2), System.Drawing.Drawing2D.MatrixOrder.Append);

    这只是您发布的代码。不过似乎对我来说效果很好。

    EDIT2:也许错误只是
    g->DrawImage(sourceBitmap, 0, 0, width, height);

    尝试
    g->DrawImage(sourceBitmap, 0, 0);

    反而

    关于image-processing - 如何使用 GDI+ 将旋转图像居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/922429/

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