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