Приложение C# для увеличения/уменьшения изображения в PictureBoxC#

Место общения программистов C#
Ответить
Anonymous
 Приложение C# для увеличения/уменьшения изображения в PictureBox

Сообщение Anonymous »

Я новичок в программировании в целом, но мне очень хочется узнать больше, и мне интересно, может ли кто-нибудь помочь мне с идеей.

(основная цель)

Я хочу создать простую программу, состоящую из приложения C# Windows Forms, которое отображает заданное изображение (размером 6000x6000 пикселей, для параметра SizeMode установлено значение Zoom, чтобы все изображение видно в форме сразу) в PictureBox, который практически займет всю форму, за исключением места внизу формы, где я хочу отобразить TrackBar, который позволит вам увеличивать и уменьшать масштаб изображения; а также горизонтальную полосу прокрутки в основании PictureBox и вертикальную полосу прокрутки в правой части PictureBox для прокрутки карты при ее масштабировании, и я хотел иметь возможность управлять этими полосами прокрутки, либо щелкая и перетаскивая в соответствующем направлении PictureBox (предпочтительно, но не уверен, возможно ли это), либо используя колесо прокрутки мыши (вероятно, проще, но опять же не уверен).

(ссылка)

[ Вот моя форма, заполненная точно так, как я описал, с демонстрационной текстурой держателя места размещения размером 6000x6000 в PictureBox с использованием SizeMode Zoom, в качестве примера - ЭТО БЫЛО ОБРАБОТАНО, СЛЕДУЮЩАЯ ЧАСТЬ ПРОБЛЕМЫ ОБНОВЛЕНА НИЖЕ:]

(дополнение)

Единственная проблема, с которой я столкнулся, — это код, поскольку я в значительной степени новичок в этом отделе. Я работал над изучением рабочего процесса Visual Studio, но мне действительно нужна была бы помощь.

Заранее большое спасибо за все, чем вы можете мне помочь.

ОБНОВЛЕНИЕ:

После исследования этой темы и поиска времени, чтобы немного подумать, я придумал код, указанный ниже; но моя проблема в том, что когда я панорамирую свое изображение слишком далеко, изображение может быть вытянуто слишком далеко, таким образом обнажая панель позади него, когда изображение панорамируется/передвигается слишком далеко в один угол. Кроме того, когда я слишком сильно уменьшаю масштаб, изображение может стать НАМНОГО меньше, чем Picturebox.

Проблема с панорамированием, проблема в серых частях панели

Проблема с масштабированием, проблема в серых частях панели

Итак, мой последний вопрос: как мне пересмотреть приведенный ниже код, чтобы «заблокировать» изображение, которое я панорамирую и масштабирую, от разрешения? панорамировать или масштабировать за пределами рамки и открывать панель за ней?

Код: Выделить всё

public partial class ImageZoomMainForm : Form
{
Image img;
Point mouseDown;
int startx = 0;
int starty = 0;
int imgx = 0;
int imgy = 0;

bool mousepressed = false;
float zoom = 1;

public ImageZoomMainForm()
{

InitializeComponent();
string imagefilename = @"..\..\ViewPort_MAIN.tif";
img = Image.FromFile(imagefilename);

Graphics g = this.CreateGraphics();

zoom = ((float)pictureBox.Width / (float)img.Width) * (img.HorizontalResolution / g.DpiX);

pictureBox.Paint += new PaintEventHandler(imageBox_Paint);
}

private void pictureBox_MouseMove(object sender, EventArgs e)
{
MouseEventArgs mouse = e as MouseEventArgs;

if (mouse.Button == MouseButtons.Left)
{
Point mousePosNow = mouse.Location;

int deltaX = mousePosNow.X - mouseDown.X;
int deltaY = mousePosNow.Y - mouseDown.Y;

imgx = (int)(startx + (deltaX / zoom));
imgy = (int)(starty + (deltaY / zoom));

pictureBox.Refresh();
}
}

private void imageBox_MouseDown(object sender, EventArgs e)
{
MouseEventArgs mouse = e as MouseEventArgs;

if (mouse.Button == MouseButtons.Left)
{
if (!mousepressed)
{
mousepressed = true;
mouseDown = mouse.Location;
startx = imgx;
starty = imgy;
}
}
}

private void imageBox_MouseUp(object sender, EventArgs e)
{
mousepressed = false;
}

protected override void OnMouseWheel(MouseEventArgs e)
{
float oldzoom = zoom;

if (e.Delta > 0)
{
zoom += 0.1F;
}

else if (e.Delta < 0)
{
zoom = Math.Max(zoom - 0.1F, 0.01F);
}

MouseEventArgs mouse = e as MouseEventArgs;
Point mousePosNow = mouse.Location;

int x = mousePosNow.X - pictureBox.Location.X;
int y = mousePosNow.Y - pictureBox.Location.Y;

int oldimagex = (int)(x / oldzoom);
int oldimagey = (int)(y / oldzoom);

int newimagex = (int)(x / zoom);
int newimagey = (int)(y / zoom);

imgx = newimagex - oldimagex + imgx;
imgy = newimagey - oldimagey + imgy;

pictureBox.Refresh();

}

private void imageBox_Paint(object sender, PaintEventArgs e)
{
e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
e.Graphics.ScaleTransform(zoom, zoom);
e.Graphics.DrawImage(img, imgx, imgy);
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;

if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
{
switch (keyData)
{
case Keys.Right:
imgx -= (int)(pictureBox.Width * 0.1F / zoom);
pictureBox.Refresh();
break;

case Keys.Left:
imgx += (int)(pictureBox.Width * 0.1F / zoom);
pictureBox.Refresh();
break;

case Keys.Down:
imgy -= (int)(pictureBox.Height * 0.1F / zoom);
pictureBox.Refresh();
break;

case Keys.Up:
imgy += (int)(pictureBox.Height * 0.1F / zoom);
pictureBox.Refresh();
break;

case Keys.PageDown:
imgy -= (int)(pictureBox.Height * 0.90F / zoom);
pictureBox.Refresh();
break;

case Keys.PageUp:
imgy += (int)(pictureBox.Height * 0.90F / zoom);
pictureBox.Refresh();
break;
}
}

return base.ProcessCmdKey(ref msg, keyData);
}

private void ImageZoomMainForm_Load(object sender, EventArgs e)
{

}
}


Подробнее здесь: https://stackoverflow.com/questions/460 ... picturebox
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»