Используйте TrackBar для пропорционального увеличения/уменьшения Picturebox

Я использую WinForms. В моей форме у меня есть изображение, которое я хочу увеличивать и уменьшать с помощью панели треков. Мой фотобокс настроен на режим масштабирования. Я хочу, чтобы изображение и картинка были пропорциональны высоте/ширине, когда я перетаскиваю панель. Как я могу это сделать?

    private void Open_btn_Click(object sender, EventArgs e)
    {
        OpenFileDialog openFileDialog1 = new OpenFileDialog();

        if(openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            Image bmp;
            bmp = new Bitmap(openFileDialog1.FileName);
            if (bmp == null)
            {
                MessageBox.Show("Loading image failed", "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);

            }
            else
            {
                pictureBox1.Image = bmp;
                openFileDialog1.Dispose();
            }

        }

    }

    private void zoomSlider_Scroll(object sender, EventArgs e)
    {
        if(TrackBar1.Value == 1)
        {
            pictureBox1.Height += 50;
            pictureBox1.Width +=  50;

        }

        if(TrackBar1.Value == 2)
        {
            pictureBox1.Height += 100;
            pictureBox1.Width += 100;
        }

        if(TrackBar1.Value == 3)
        {
            pictureBox1.Height += 200;
            pictureBox1.Width += 200; 
        }

    //This is not exactly what i had in mind...
    }

введите здесь описание изображения


person taji01    schedule 06.02.2016    source источник


Ответы (1)


Когда форма изначально создана, вы должны сохранить размер

Form1 : Form
{
   private Size _pictOriginalSize;
   Form1()
   {
       InitialiseComponent();
       _pictOriginalSize = pictureBox1.Size;
       zoomSlider.Minimum = 0;
       zoomSldier.Maximum = 1000;
       ...
   }

Теперь вы знаете, каков был его без увеличения размер.

Далее вам нужно будет преобразовать значение ползунка в масштабный коэффициент.

private void zoomSlider_Scroll(object sender, EventArgs e)
{
    const double MaxScale = 5.0; // The scale factor when the is at it's max

    double scale = Math.Pow(MaxScale, TrackBar1.Value / TrackBar1.Maximum);

    Size newSize = new Size((int) (_pictOrignalSize.Width * scale),
                   (int) (_pictOrignalSize.Height * scale));

    pictureBox.Size = newSize;
}

Я использую функцию Math.Pow для преобразования шкалы от 1 до 5 по экспоненциальной шкале - вы можете использовать другую технику, которую вы могли бы рассмотреть.

  • если ползунок имеет значения от 1 до 5, а значение просто становится шкалой: scale = zoomSlider.Value - но это дает вам только результат 1.
  • ползунок имеет значения от 1 до 5000 и выполняет двойное деление double scale = zoomSlider.Value / 1000.0; Это дает вам 1000 различных разрешений.

NB: я использую 5 только в качестве примера — вы можете использовать любое значение для максимального коэффициента масштабирования.

person Jens Meinecke    schedule 06.02.2016
comment
Спасибо, Ubercoder, я внедрил это в свой код, он почти работает. То, что я хочу сделать, это то, что когда вы перетаскиваете изображение, оно становится больше или меньше. В настоящее время изображение становится большим только один раз и маленьким один раз. Большой, когда он достигает своего максимума, и маленький, когда его значение равно 0. - person taji01; 06.02.2016