【问题标题】:How to crop an image in vb.net?如何在 vb.net 中裁剪图像?
【发布时间】:2012-02-02 06:33:22
【问题描述】:

图像可以是任何东西。它可以是 jpg、png 等任何格式。

加载它。

裁剪它。假设从左侧移除前 100 个像素。

保存到同一个文件

【问题讨论】:

    标签: vb.net image crop


    【解决方案1】:

    区域“图像裁剪”

    Dim cropX As Integer
    Dim cropY As Integer
    Dim cropWidth As Integer
    Dim cropHeight As Integer
    
    Dim oCropX As Integer
    Dim oCropY As Integer
    Dim cropBitmap As Bitmap
    
    Public cropPen As Pen
    Public cropPenSize As Integer = 1 '2
    Public cropDashStyle As Drawing2D.DashStyle = Drawing2D.DashStyle.Solid
    Public cropPenColor As Color = Color.Yellow
    Private Sub RotateBtn_Click(sender As System.Object, e As EventArgs) Handles RotateBtn.Click
    
        ' RotateImage(PreviewPictureBox.Image, offset:=, angle:=90)
        crobPictureBox.Image.RotateFlip(RotateFlipType.Rotate270FlipNone)
        'PreviewPictureBox.Image.RotateFlip(RotateFlipType.Rotate270FlipNone)
        '(45, PreviewPictureBox.Image)
    End Sub
    Private Sub crobPictureBox_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles crobPictureBox.MouseDown
        Try
    
            If e.Button = Windows.Forms.MouseButtons.Left Then
    
                cropX = e.X
                cropY = e.Y
    
                cropPen = New Pen(cropPenColor, cropPenSize)
                cropPen.DashStyle = DashStyle.DashDotDot
                Cursor = Cursors.Cross
    
            End If
            crobPictureBox.Refresh()
        Catch exc As Exception
        End Try
    End Sub
    Dim tmppoint As Point
    Private Sub crobPictureBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles crobPictureBox.MouseMove
        Try
    
            If crobPictureBox.Image Is Nothing Then Exit Sub
    
            If e.Button = Windows.Forms.MouseButtons.Left Then
    
                crobPictureBox.Refresh()
                cropWidth = e.X - cropX
                cropHeight = e.Y - cropY
                crobPictureBox.CreateGraphics.DrawRectangle(cropPen, cropX, cropY, cropWidth, cropHeight)
            End If
            ' GC.Collect()
    
        Catch exc As Exception
    
            If Err.Number = 5 Then Exit Sub
        End Try
    
    End Sub
    
    Private Sub crobPictureBox_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles crobPictureBox.MouseUp
        Try
            Cursor = Cursors.Default
            Try
    
                If cropWidth < 1 Then
                    Exit Sub
                End If
    
                Dim rect As Rectangle = New Rectangle(cropX, cropY, cropWidth, cropHeight)
                Dim bit As Bitmap = New Bitmap(crobPictureBox.Image, crobPictureBox.Width, crobPictureBox.Height)
    
                cropBitmap = New Bitmap(cropWidth, cropHeight)
                Dim g As Graphics = Graphics.FromImage(cropBitmap)
                g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
                g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
                g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
                g.DrawImage(bit, 0, 0, rect, GraphicsUnit.Pixel)
                ' g.DrawImage(bit, 0, 0, rect,GraphicsUnit.Pixel)
                PreviewPictureBox.Image = cropBitmap
    
            Catch exc As Exception
            End Try
        Catch exc As Exception
        End Try
    End Sub
    

    【讨论】:

      【解决方案2】:

      使用Graphics.DrawImage Method (Image, RectangleF, RectangleF, GraphicsUnit) 方法。

          Dim fileName = "C:\file.jpg"
          Dim CropRect As New Rectangle(100, 0, 100, 100)
          Dim OriginalImage = Image.FromFile(fileName)
          Dim CropImage = New Bitmap(CropRect.Width, CropRect.Height)
          Using grp = Graphics.FromImage(CropImage)
              grp.DrawImage(OriginalImage, New Rectangle(0, 0, CropRect.Width, CropRect.Height), CropRect, GraphicsUnit.Pixel)
              OriginalImage.Dispose()
              CropImage.Save(fileName)
          End Using
      

      【讨论】:

      • 使用 Dispose() 代替 MemoryStream hack。
      • 为什么我们需要使用dispose?我的意思是它会自己消失对吧?
      • @JimThio - 正如你所说,你想将它保存到同一个文件中。
      • 使用这种方法,当我裁剪到原来的 2/3 时,新的重量是原来的 3 倍。有什么线索吗?
      【解决方案3】:

      参考:Graphics.DrawImageImage Cropping with Image Resizing Using VB.NET

      private void btnCropImage_Click(object sender, EventArgs e)
          {
              OpenFileDialog dlg = new OpenFileDialog();
              dlg.ShowDialog();
              //check your filename or set constraint on fileopen dialog
              //to open image files
              string str = dlg.FileName;
      
              //Load Image File to Image Class Object to make crop operation
              Image img = System.Drawing.Bitmap.FromFile(str);
      
              // Create rectangle for source image, what ever it's size. 
              GraphicsUnit units = GraphicsUnit.Pixel;
              RectangleF srcRect = img.GetBounds(ref units);
      
              // Create rectangle for displaying image - leaving 100 pixels from left saving image size.
              RectangleF destRect = new RectangleF(100.0F, 0.0F, srcRect.Width - 100, srcRect.Height);
      
              // Bitmap class object to which saves croped image
              Bitmap bmp = new Bitmap((int)srcRect.Width - 100, (int)srcRect.Height);
      
              // Draw image to screen.
              Graphics grp = Graphics.FromImage(bmp);
              grp.DrawImage(img, destRect, srcRect, units);
      
              //save image to disk
              bmp.Save("e:\\img.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
      
              //Clear memory for Unused Source Image
              img.Dispose();
          }
      

      希望对你有所帮助..

      【讨论】:

      • 感谢您的回答。如何根据边框的颜色裁剪图像?
      猜你喜欢
      • 2015-02-02
      • 2012-11-16
      • 2021-07-24
      • 2021-06-24
      • 2020-08-14
      • 2011-09-21
      • 2012-04-22
      • 2019-06-02
      • 2011-12-18
      相关资源
      最近更新 更多