如何打开图像并裁剪?

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
虽然我不希望在适当的时候劝阻人们使用此论坛,但论坛应该是您的最后选择,当您在寻找所需的信息而又找不到或无法理解所找到的信息时。在这种情况下,您似乎没有尽力查找现有信息,因为我只是在搜索"Windows窗体C#裁剪图像"第一场比赛回答了您的问题。


就像我说的那样,当您遇到问题时,不要犹豫地发布问题,但请先做您自己可以做的事情,然后等到您真正陷入困境后再发布。这样做最符合您自己的利益,因为您为自己寻找信息的次数越多,发现信息的能力就越强,这意味着您不必等待别人四处寻找答案。您还会经常发现其他您根本不需要的有用信息。我从这两个方面的经验出发。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
我将为您提供有关正确事件的一些提示,以帮助您开始制作裁剪工具。由于我最近时间比较紧张,因此我无法详细介绍,但是我相信,如果我不在这一周,这里的人们将帮助回答您的任何问题。您可以在MSDN文档中搜索以下代码的参考。

另外,您也可以从该项目的一些代码中进行选择: 使用C#进行图像处理 -在本文的后续部分,您将看到一些用于裁剪图像的代码。

下面是我制作裁剪工具的方法,如果您看一下位图克隆方法,它实际上并不难。

Button1:
        private void Button1_Click(object sender, EventArgs e)
        {
            openFDiag.Filter = "Images (*.BMP;*.JPG;*.GIF,*.PNG,*)|*.BMP;*.JPG;*.GIF;*.PNG;";
            if (openFDiag.ShowDialog() == DialogResult.OK)
            {
                eFile = openFDiag.FileName;
                pictureBox1.BackgroundImage = Image.FromFile(eFile);
                pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
            }
        }
Declarations:
private int mouseMoveX, mouseMoveY; public static OpenFileDialog openFDiag = new OpenFileDialog(); public static string eFile;

从鼠标事件获取鼠标位置:
        private void PictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
              //Check e. properties
        }
C#:
       private void PictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            //Same as MouseDown, check e.Properties for mouse coordinates
        }
当鼠标移动时,通过委托将坐标发送到新线程并更新UI:
private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            mouseMoveX = e.X; mouseMoveY = e.Y;
            ThreadStart updateThread = delegate
            {
                UpdateLabel(mouseMoveX, mouseMoveY);
            };
            new Thread(updateThread).Start();
        }
//The following will update the text on label1 which outputs the coordinates of your mouse pointer
private void UpdateLblText(string text)
        {
            label1.Text = text;
        }
//This delegate will be invoked to update the UI from the later invoking method which sits on the new thread
public delegate void lblCallback(string text);
        private void UpdateLabel(int mX, int mY)
        {
            Invoke(new lblCallback(UpdateLblText), new object[] { string.Concat(string.Concat(string.Concat("MOUSE COORDINATES :: MouseX.", mouseMoveX, " / MouseY.", mouseMoveY)))});
        }
由于每次鼠标移动都会触发鼠标移动事件,因此坐标将根据鼠标位置更新标签。因此,我已在一个单独的线程中运行此事件,因为我想保留所有涉及在单独的或后台线程上与UI交互或更新UI的内容。这是常见的做法,也是我偏爱从另一个线程更新UI的偏好,无论更改多么微不足道或多么简单,在处理涉及更新UI的任何事情时,您都应该适应该偏好。

最后,使用位图克隆,您现在可以找到文档和源代码,并尝试自行进行构建。馅饼的最后一部分是将位图克隆方法实现到我已经给您的内容中。这样做的文档位于: Bitmap.Clone方法(System.Drawing)

希望您觉得这有用。
 
最佳 底部