C# повернуть встроенное изображение

У меня есть изображение, которое загружает файл .PNG, а затем объединяет его с другой графикой, которую я создаю. Дело в том, что мне нужно повернуть только файл .PNG, а не весь. Представьте себе спидометр, у вас есть фоновое изображение, которое меняется от 0 до 200. Это изображение все время остается статичным. Теперь, поверх него, у вас есть стрелка, указывающая на вашу текущую скорость. Это то, что я хочу повернуть.

Это то, что у меня есть до сих пор. Он отображает графику, но не поворачивает .PNG (стрелка).

        Bitmap bitmap = new Bitmap(500, 280, PixelFormat.Format24bppRgb);
        Graphics g = Graphics.FromImage(bitmap);
        g.Clear(Color.White);

        //this.Arrow = path to the .PNG
        Image i = Image.FromFile(this.Arrow);
        Bitmap a = new Bitmap(i.Width, i.Height);
        Graphics ga = Graphics.FromImage(a);
        a.SetResolution(ga.DpiX, ga.DpiY);

        //It shouldn't rotate having the pivot at the (centre, centre)
        //coordinates, but at the bottom of the image. 
        //The (21, 110) coordinates are right relative to the .PNG file
        ga.TranslateTransform(21, 110);
        ga.RotateTransform(45);   //<--- Not rotating
        ga.DrawImage(i, 0, 0);

        g.DrawImage(i, new Rectangle(new Point(229, 120), new Size(i.Width, i.Height)));

        g.DrawLine(new Pen(new SolidBrush(Color.Aquamarine), 1), 250, 0, 250, 280);
        g.DrawLine(new Pen(new SolidBrush(Color.Aquamarine), 1), 0, 230, 500, 230);

Есть идеи?


person MaoMonroy    schedule 23.09.2015    source источник
comment
Ваша проблема может быть связана с первым ответом на этот другой вопрос: .com/questions/27996037/   -  person Keith M    schedule 24.09.2015
comment
Это еще не работает. Даже пробовал с классом Matrix() и свойством .Transform, но результат тот же.   -  person MaoMonroy    schedule 24.09.2015


Ответы (1)


Без хорошего, минимального, полного примера кода, надежно воспроизводящего проблему , невозможно точно знать, в чем проблема. В опубликованном вами коде есть несколько возможных проблем; наиболее очевидным является то, что вы рисуете изображение i в объект Graphics g, а не изображение a, в которое вы нарисовали i с поворотом на 45 градусов.

Скорее всего, вы получите результаты, более близкие к желаемым, если измените этот оператор программы на этот:

g.DrawImage(a, new Rectangle(new Point(229, 120), new Size(a.Width, a.Height)));

Другие проблемы включают в себя:

  • Невозможность избавиться от ga и g после завершения работы с ними
  • Неспособность перевести ga обратно в нужное место после поворота (т. е. вы переводите, чтобы вращение изображения произошло вокруг точки (21, 110) изображения, но оставили изображение, переведенное на эту величину после поворота, что может быть не тем, что вы хотите
  • Использование положительных смещений для ранее упомянутого перевода

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

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

person Peter Duniho    schedule 23.09.2015
comment
Хороший минимальный пример кода опубликован. Это то, что я использую. - person MaoMonroy; 24.09.2015
comment
Прочтите предоставленную мной ссылку, чтобы понять, что подразумевается под хорошим, минимальным, полным примером кода. Минимум является необходимым, но недостаточным условием. Ваш пример также должен быть полным. Кроме того, пожалуйста, подумайте о том, чтобы прочитать ответ и попробовать предложенное решение, прежде чем отклонять его. - person Peter Duniho; 24.09.2015