Вместо того, чтобы думать об этом как об «извлечении», мне нравится думать об этом как «изолировании». Как только нужные биты изолированы, вы можете делать с ними все, что хотите.
Чтобы выделить любой набор битов, примените маску AND.
Если вам нужны последние X битов значения, можно воспользоваться простым приемом.
unsigned mask;
mask = (1 << X) - 1;
lastXbits = value & mask;
Если вы хотите выделить серию битов Х в середине значения, начиная с startBit ...
unsigned mask;
mask = ((1 << X) - 1) << startBit;
isolatedXbits = value & mask;
Надеюсь, это поможет.
После поворота сначала переместите изображение обратно в исходное положение, а затем, вдвое меньше разницы, новый холст станет больше. Если ваш расчет в 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);