Matrix rotateAt c # - PullRequest
       28

Matrix rotateAt c #

1 голос
/ 01 сентября 2009

Я пытаюсь повернуть изображение с помощью матричного объекта и не могу получить его правильно

Когда я поворачиваю изображение, у меня появляется черное пятно, оно ошибается на один пиксель и то же самое с углом 180 и углом 270.

90 угол отл. Картина этой проблемы: http://www.spasm -design.com / повернуть / onePixelWrong.jpg


А вот и код:

public System.Drawing.Image Rotate(System.Drawing.Image image, String angle, String direction)
{
  Int32 destW, destH;
  float destX, destY, rotate;

  destW = image.Width;
  destH = image.Height;
  destX = destY = 0;

  if (r == "90" || r == "270")
  {
    destW = image.Height;
    destH = image.Width;

    destY = (image.Width - destW) / 2;
    destX = (image.Height - destH) / 2;
  }

  rotate = (direction == "y") ? float.Parse(angle) : float.Parse("-" + angle);

  Bitmap b = new Bitmap(destW, destH, PixelFormat.Format24bppRgb);
  b.SetResolution(image.HorizontalResolution, image.VerticalResolution);

  Matrix x = new Matrix();
  x.Translate(destX, destY);
  x.RotateAt(rotate, new PointF(image.Width / 2, image.Height / 2));

  Graphics g = Graphics.FromImage(b);
  g.PageUnit = GraphicsUnit.Pixel;
  g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  g.Transform = x;
  g.DrawImage(image, 0, 0);

  g.Dispose();
  x.Dispose();

  return b;
}

если у кого-то есть хорошее представление, почему это происходит, пожалуйста, скажите мне.

Хорошего дня!

Ответы [ 3 ]

0 голосов
/ 01 сентября 2009

Это работает: x.RotateAt (поворот, новый PointF (image.Width / 2, image.Height / 2)); это "image.Width / 2" возвращает float

Сначала я узнаю, что такое угол, если он составляет 90 или 270, чтобы перевернуть изображение, чтобы image.width = image.height и image.height = width

Если при этом возникает проблема, когда я поворачиваю изображение, ширина изображения может быть больше, чем высота изображения, поэтому мне нужно сбросить координаты x, y на 0,0

.

Итак, это "destY = (image.Width - destW) / 2;" рассчитать смещение изображения к растровому изображению и это "x.Translate (destX, destY)"; установить изображение х, эквивалентное растровому изображению х

но что-то идет не так, потому что вращение делает картинку на 1 пиксель меньше.

так что для моего английского, но я не лучший из них, я надеюсь, что вы можете прочитать его почему ...)

для получения дополнительных вопросов, пожалуйста, пришлите мне их, и я постараюсь объяснить, что я имею в виду.

0 голосов
/ 07 июля 2011

Гораздо более простое решение:

  1. Добавьте один пиксель вокруг изображения.
  2. Поворот изображения.
  3. Удалить один пиксель.

Код:

// h and w are the width/height
// cx and cy are the centre of the image
myBitmap = new Bitmap(w + 2, h + 2);
mygraphics = Graphics.FromImage(myBitmap);
mygraphics.TranslateTransform(cx, cy);
mygraphics.RotateTransform(angle);
mygraphics.TranslateTransform(-cx, -cy);
mygraphics.DrawImage(myimage, new Point(1, 1));

// image crop
myBitmap= myBitmap.Clone(new Rectangle(1, 1, (int)w, (int)h), myimage.PixelFormat)

Это основная идея. Надеюсь, это поможет.

0 голосов
/ 01 сентября 2009

Я думаю, что вы только что получили ошибку округления в этой строке:

x.RotateAt(rotate, new PointF(image.Width / 2, image.Height / 2));

Ширина и Высота - оба свойства int.Попробуйте вместо этого:

x.RotateAt(rotate, new PointF((float)Math.Floor(image.Width / 2),
    (float)Math.Floor(image.Height / 2)));

(не проверено, поэтому не уверен, сработает ли это.)

Обновление : я не думаю, что мое выше исправление будет работать, но это может указать вам направление проблемы.Если вы не можете исправить это, отрегулировав округление, вам может потребоваться изменить destX на -1, чтобы избавиться от черной линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...