2009-11-22 3 views
3

Я рисую изображение из MetaFile (emf), а затем применяю некоторые преобразования вращения ко всем внутри OnPaint UserControl. После применения этих преобразований, как я могу вычислить нормальный нетрансформированный прямоугольный ограничивающий прямоугольник этого в экранных координатах? Мне нужно это, чтобы иметь возможность изменять размер повернутого изображения до размера UserControl.Вычислить ограничительную рамку чертежа GDI +

protected override void OnPaint(PaintEventArgs e) 
{ 
    // rotate around the center of this UserControl 
    e.Graphics.TranslateTransform(this.Width/2.0f, this.Height/2.0f); 
    e.Graphics.RotateTransform(this.Rotation); 
    e.Graphics.TranslateTransform(this.Width/-2.0f, this.Height/-2.0f); 

    // TODO: now scale so the image so it fits exactly into this UserControl 

    // draw the image at the center of this UserControl 
    float left = (this.Width - ResourceManager.MyDrawingMetaFile.Width)/2.0f; 
    float top = (this.Height - ResourceManager.MyDrawingMetaFile.Height)/2.0f; 
    e.Graphics.DrawImage(Resources.MyDrawingMetaFile, left, top); 
} 

Вся идея в том, что я хочу, чтобы отобразить повернут .emf файл в UserControl и имею эдс рисунок заполнить ВСЕГДА доступное пространство в UserControl. Может быть, есть лучший подход?

Заполненный режим/растягивание, которое я получаю, равномерно и равномерно заполнено (как в окне просмотра WPF). ЭДС не должна быть искажена в едином режиме. ЭДС полностью заполняет пользовательский контроль, по крайней мере, в одном измерении, ничто не обрезается. В UniformToFill emf заполняет UserControl в обоих измерениях, и если aspectratios не совпадают, emf обрезается в одном измерении.

+0

Как вы хотите, чтобы это «заполнило»? Если ЭДС полностью покрывает пользовательский контроль (должна ли какая-то часть э.д.с. быть обрезана) или должна ли она быть такой, чтобы вся ЭДС была видимой - оставив части пользовательского контроля? И должна ли emf сохранить исходное соотношение сторон или нет? –

+0

Заполненная/растягиваемая мода, которую я получаю, является Uniform и UniformToFill (как в окне просмотра WPF). ЭДС не должна быть искажена в едином режиме. ЭДС полностью заполняет пользовательский контроль, по крайней мере, в одном измерении, ничто не обрезается. В UniformToFill emf заполняет UserControl в обоих измерениях, и если aspectratios не совпадают, emf обрезается в одном измерении. – bitbonk

ответ

1

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

Затем вы можете сделать так:

  1. Наполните четыре координаты вашего ограничивающего прямоугольника в точке [].
  2. Настройте матрицу с вашим вращением (.RotateAt)
  3. Пусть матрица преобразует четыре точки.
  4. Сортируйте четыре преобразованные координаты X и сравните ширину нового ограничивающего прямоугольника (pts [3] .X - pts [0] .X после сортировки).
  5. Теперь вы знаете, как масштабировать ширину для идеальной подгонки.
  6. Повторите шаг 4 для высоты.
+0

Мои рисунки не обязательно прямоугольные.Например, если рисунок представляет собой круг, сам поворот не повлияет на масштабный коэффициент. – bitbonk

+0

Тогда вам нужно сделать выше для каждого * угла * на изображении. Разумеется, круг должен быть аппроксимирован, и считается, что он состоит из нескольких сегментов линии. –

+0

Интересно, как WPF (возможно, в слое DWM где-то) делает это. – bitbonk

0

Как это будет сделано с GDI является:

BeginPath() 
// Draw stuff 
EndPath() 
PathToRegion() 
GetRgnBox() 

GDI + имеет эквиваленты - The GraphicsPath и классы региона могут сделать выше

+0

Мой рисунок происходит из метафайла, поэтому я думаю, что GraphicsPath не будет применяться. – bitbonk

+0

Метафайл - это просто сериализация вызовов GDI, поэтому он должен работать с GraphicsPath. В любом случае класс MetaFile имеет метод GetMetafileHeader, вы можете получить ограничительную рамку метафайла и использовать тригинометрию для получения повернутого размера. –

+0

Хорошо, что GraphicsPath не имеет метода AddMetaFile или AddDrawing или аналогичного метода. – bitbonk