Переместить PictureBox после увеличения C # - PullRequest
0 голосов
/ 11 июня 2019

У меня есть PictureBox внутри Panel, и я реализовал функцию масштабирования с TrackBar.

Когда я увеличиваю (или уменьшаю) PictureBox, положениеизображение остается фиксированным на левой стороне PictureBox.См. Пример, чтобы лучше понять проблему.

enter image description here

Мне нужна возможность перемещения изображения по сравнению с центром Panel.См. Следующий пример

enter image description here

Например, я попытался определить происхождение PictureBox X следующим образом:

  1. перед увеличением я вычисляю расстояние (Δdx) между началом PictureBox (x0) и центром Panel (x1).
  2. Я увеличиваю расстояние с коэффициентом увеличения (Δdx ').
  3. Я вычисляю новый источник изображения (x0 ') как x1 - Δdx'

Я делаю то же самое с Y и определяю новое местоположение PictureBox сx0 'и y0'.

Вот код:

// new image width after the zoom
double width = pbImg.Image.Width + (pbImg.Image.Width * trackbar.Value / 100);

// new image height after the zoom
double height = pbImg.Image.Height + (pbImg.Image.Height * trackbar.Value / 100);

// panel center
int cX = panel.Width / 2;
int cY = panel.Height / 2;

// actual origin for the picturebox
int imgX = pbImg.Location.X;
int imgY = pbImg.Location.Y;

// distance the panel center and the picturebox origin
int distFromXc = cX - imgX;
int distFromYc = cY - imgY;

// new distance with zoom factor
distFromXc = distFromXc + (distFromXc * trackbar.Value / 100);
distFromYc = distFromYc + (distFromYc * trackbar.Value / 100);

// new origin point for the picturebox
int pbX = (cX - distFromXc);
int pbY = (cY - distFromYc);

// new dimension for the picturebox
pbImg.Size = new Size(Convert.ToInt32(width), Convert.ToInt32(height));

// relocate picturebox
Point p = new Point(pbX, pbY);
pbImg.Location = p;

Я пытался изменить этот код C#, но я с ним не знаком.

В моем случае я хочу управлять Picturebox и изображением внутри него как одним и тем же объектом (если это возможно).

Мне нужна возможность увеличить (или уменьшить) Picturebox (иизображение внутри), но я хочу, чтобы Picturebox оставался в центре там, где он находится в настоящее время.

SizeMode изображения StretchImage.

Trackbar имеет 0%как он минимальное значение и 100% как максимум.Размер Picturebox и изображение внутри могут быть переменными, я получаю изображения из другого программного обеспечения.

Увеличенное Picturebox может быть больше, чем Panel, но это не проблема,потому что я могу переместить его.

Проблемы заключаются в следующем: 1. Если я использую код, который я написал выше, репозиция, кажется, работает, но Picturebox не изменяется.2. Если я использую фиксированное значение для источника Picturebox (например, Point p = new Point(50, 50)), изменение размера работает, но, очевидно, положение Picturebox фиксировано.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Если вы хотите, чтобы PictureBox оставался по центру там, где он находится в данный момент, и только увеличивал или сдавливал «на месте», попробуйте что-то вроде этого:

double width = pbImg.Width * trackbar.Value / 100;
double height = pbImg.Height * trackbar.Value / 100;
Rectangle rc = pbImg.Bounds;
rc.Inflate((int)((width - pbImg.Width) / 2), (int)((height - pbImg.Height) / 2));
pbImg.Bounds = rc;

Обратите внимание, что все это зависит от размерасамого PictureBox, НЕ Изображение внутри.Не уверен, какой SizeMode вы установили для PB ...

enter image description here

---------- EDIT ---------

Я использую StretchImage в качестве SizeMode.Можно ли вести себя так же, но без кнопки?Когда я перемещаю курсор слева направо, Pb увеличивается и уменьшается справа налево - Scarj

Конечно.Поместите мой код в события ValueChanged () и / или Scroll ().- Idle_Mind

Исходное сообщение работает от текущего размера PictureBox.Возможно, вы захотите сохранить исходный Bounds () PB (возможно, в свойстве Tag ()), а затем всегда вычислять новый размер на основе этого.

Вот пример этого:

private void Form1_Load(object sender, EventArgs e)
{
    pbImg.Tag = pbImg.Bounds;
}

private void button1_Click(object sender, EventArgs e)
{

}

private void trackBar1_Scroll(object sender, EventArgs e)
{
    ZoomPB();
}

private void trackBar1_ValueChanged(object sender, EventArgs e)
{
    ZoomPB();
}

private void ZoomPB()
{
    Rectangle rc = (Rectangle)pbImg.Tag;
    double width = rc.Width * trackbar.Value / 100;
    double height = rc.Height * trackbar.Value / 100;
    rc.Inflate((int)((width - rc.Width) / 2), (int)((height - rc.Height) / 2));
    pbImg.Bounds = rc;
}

enter image description here

0 голосов
/ 11 июня 2019

Это потому, что вы изменяете размер изображения, а не размер изображения в нем. Чтобы изображение соответствовало размеру графического блока, убедитесь, что вы установили режим размера растягивающего изображения

pbImg.SizeMode = PictureBoxSizeMode.StretchImage

, чтобы заставить его работать, вы можете добавить эту строку непосредственно перед тем, как изменить размер графического блока, однако я рекомендую установить его на Picturebox во время его создания.

См .: Разместить изображение в PictureBox

...