System.Drawing.Bitmap GetBounds GraphicsUnit.Inch

Кто-нибудь может сказать мне, как вернуть прямоугольник от GetBounds в любых единицах ДРУГИЕ, чем пиксели? Следующий код, снятый непосредственно с документации MSDN для этой функции, возвращает прямоугольник, который явно в пикселях, а не в точках (1/72 дюйма). (Если только значки не имеют размер 32/72"x32/72", а не 32x32 пикселей, как я думаю). Меня больше всего интересует работа с прямоугольником в дюймах, но я бы согласился просто увидеть, как параметр GetBounds pageUnit вызывает изменение в возвращаемом прямоугольнике.

Bitmap bitmap1 = Bitmap.FromHicon(SystemIcons.Hand.Handle);
Graphics formGraphics = this.CreateGraphics();
GraphicsUnit units = GraphicsUnit.Point;

RectangleF bmpRectangleF = bitmap1.GetBounds(ref units);
Rectangle bmpRectangle = Rectangle.Round(bmpRectangleF);
formGraphics.DrawRectangle(Pens.Blue, bmpRectangle);
formGraphics.Dispose();

3 ответа

Решение

Информация немного об этом, я смог найти эту публикацию на форуме MSDN, которая предполагает, что поскольку битмап уже создан, модули уже установлены и не подлежат изменению. Так как GraphicsUnit передается по ссылке, если вы посмотрите на нее после вызова, вы найдете его обратно Pixel от Inch, Если вы действительно хотите изменить размер, на котором нарисован прямоугольник, установите Graphics.PageUnit Property на formGraphics к GraphicsUnit Вы хотите нарисовать прямоугольник в.

Сверху Ссылка:

В этом примере параметры метода Image.GetBounds не изменяют результат, поскольку была определена граница Bitmap. Параметры определяют только длину блока для работы с диапазоном, дюйм за дюймом или точка за точкой. Но параметры не будут влиять на результат.

акцент мой

Немного поздно отвечая на этот вопрос, но я подумал, что сделаю это, потому что я нашел его в Google, когда пытался ответить на вопрос "сколько мм я могу уместить в моей картинке?", Это сэкономило бы мне много времени, не придумывать, как это сделать! GetBounds бесполезен (если вы хотели это в пикселях...), но можно найти связь между единицами рисования и пикселями дисплея, используя метод Graphics.TransformPoints:

    private void Form1_Load(object sender, EventArgs e)
    {
        Bitmap b;
        Graphics g;
        Size s = pictureBox1.Size;
        b = new Bitmap(s.Width, s.Height);
        g = Graphics.FromImage(b);
        PointF[] points = new PointF[2];
        g.PageUnit = GraphicsUnit.Millimeter;
        g.PageScale = 1.0f;
        g.ScaleTransform(1.0f, 1.0f);
        points[0] = new PointF(0, 0);
        points[1] = new PointF(1, 1);
        g.TransformPoints(CoordinateSpace.Device, CoordinateSpace.Page, points);
        MessageBox.Show(String.Format("1 page unit in {0} is {1} pixels",g.PageUnit.ToString(),points[1].X));
        points[0] = new PointF(0, 0);
        points[1] = new PointF(1, 1);
        g.TransformPoints(CoordinateSpace.Page, CoordinateSpace.World, points);
        MessageBox.Show(String.Format("1 page unit in {0} is {1} pixels",g.PageUnit.ToString(),points[1].X));
        g.ResetTransform();
        pictureBox1.Image = b;
        SolidBrush brush = new SolidBrush(Color.FromArgb(120, Color.Azure));
        Rectangle rectangle = new Rectangle(10, 10, 50, 50);
        // Fill in the rectangle with a semi-transparent color.
        g.FillRectangle(brush, rectangle);
        pictureBox1.Invalidate();

    }

Это будет отображать базовый мм для отображения пикселей (3.779527 в моем случае) - мировые координаты равны 1 мм на пиксель, это изменилось бы, если бы вы применили graphics.ScaleTransform.

Редактировать: Конечно, это полезно, если вы назначаете растровое изображение свойству изображения pictureBox (и сохраняете объект Graphics, чтобы разрешить изменения по мере необходимости).

Добавить метку В класс Form1 Добавить поле PointF[] cooridates;Form1.cs [дизайн] найдите молнию в свойствах, дважды щелкните Paint, создайте обработчик Form1_Paint(отправитель объекта,PaintEventArgs){e.Graphics.PageUnit = GraphicsUnit.Inch;if (cooridates != null)e.Graphics.TransformPoints(CoorinateSpace.World,CoorinateSpace.Device,cooridates);} Снова создайте обработчик для Form1.MouseMove Form1_MouseMove(object sender,MouseEventArgs e { cooridates[0].X = e.Location.X; cooridates[0].Y = e.Location.Y; this.Refresh(); label1. Text = $"X = {координаты[0].X} Y = {{координаты[0].Y} "; }

                                                                                  Form1_Load(object sender,MouseEventArgs)
                                                                                {
                                                                                    cooridates = new PointF[1] { new PointF(0f,0f) };
                                                                                         }

                                                                                             Move mouse to get cooridates in Inches
Другие вопросы по тегам