После поворота сначала переместите изображение обратно в исходное положение, а затем вдвое больше нового холста. Если ваши вычисления в 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);
вместо