Как я центрирую повернутое изображение с помощью GDI +?

Вместо того, чтобы думать об этом как об «извлечении», мне нравится думать об этом как «изолировании». Как только нужные биты изолированы, вы можете делать с ними все, что хотите.

Чтобы выделить любой набор битов, примените маску AND.

Если вам нужны последние X битов значения, можно воспользоваться простым приемом.

unsigned  mask;
mask = (1 << X) - 1;
lastXbits = value & mask;

Если вы хотите выделить серию битов Х в середине значения, начиная с startBit ...

unsigned  mask;
mask = ((1 << X) - 1) << startBit;
isolatedXbits = value & mask;

Надеюсь, это поможет.

6
задан Community 23 May 2017 в 12:34
поделиться

1 ответ

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

6
ответ дан 17 December 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: