Когда я запускаю следующий код:
private void button1_Click(object sender, EventArgs e)
{
Bitmap b = new Bitmap(300, 400);
using (Graphics g = Graphics.FromImage(b))
{
g.FillRectangle(Brushes.Black, new Rectangle(0, 0, 300, 400));
}
b.RotateFlip(RotateFlipType.Rotate90FlipNone);
using (Graphics g2 = Graphics.FromImage(b))
{
g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 150, 100);
}
using (Graphics g3 = this.panel1.CreateGraphics())
{
g3.DrawImage(b, 0, 0);
}
}
Я получаю следующее:
alt text http://www.freeimagehosting.net/uploads/2c309ec21c.png
Примечания:
Это происходит только тогда, когда я поворачиваю изображение, а затем рисую прямоугольник, который проходит за исходные размеры изображения.
Прямоугольник не усекается до первоначальной ширины изображения - только правый край прямоугольника не нарисован.
Это происходит во множестве сценариев. Я впервые заметил это в гораздо более сложном приложении - я просто написал это приложение, чтобы сделать простую иллюстрацию проблемы.
Может ли кто-нибудь увидеть, что я делаю неправильно?
Кажется, это ошибка GDI +, о которой Microsoft знала с 2005 года (http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=96328). Я смог воспроизвести описанную вами проблему. Одним из возможных решений могло бы стать создание второго растрового изображения с первого и сделать это. Следующий код выглядит правильно:
private void button1_Click(object sender, EventArgs e) {
Bitmap b = new Bitmap(300, 400);
using (Graphics g = Graphics.FromImage(b)) {
g.FillRectangle(Brushes.Black, new Rectangle(0, 0, 300, 400));
}
b.RotateFlip(RotateFlipType.Rotate90FlipNone);
Bitmap b2 = new Bitmap(b);
using (Graphics g2 = Graphics.FromImage(b2)) {
g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 150, 100);
}
using (Graphics g3 = this.panel1.CreateGraphics()) {
g3.DrawImage(b2, 0, 0);
}
}
alt text http://www.freeimagehosting.net/uploads/f6ae684547.png
Ваша проблема - DrawRectangle. Начальное расположение вашего прямоугольника достигает конца вашего исходного растрового изображения.
Если вы измените местоположение своего прямоугольника, вы сможете увидеть его полностью.
using (Graphics g2 = Graphics.FromImage(b))
{
g2.DrawRectangle(new Pen(Color.White, 7.2f), 50, 50, 150, 100);
}
Я пробовал свой код с TryGdiPlus (очень полезно для таких вещей, BTW). Мне удалось сделать рисование прямоугольника без обрезки с шириной 99 пикселей:
g2.DrawRectangle(new Pen(Color.White, 7.2f), 200, 100, 99, 100);
Итак, похоже, что ширина растрового изображения еще 300 пикселей даже после поворота.