Image Crop (Cắt ảnh đơn giản) với VB.NET
Hôm nay lang thang trên internet thấy có đoạn code cắt ảnh khá đơn giản, mình rãnh viết demo cho các bạn tham khảo. Ý tưởng ở công cụ này cũng tương tự như những phần mềm cắt ảnh chuyên nghiệp khác là dùng chuột đánh dấu vùng ảnh cần để cắt. Sau khi đánh dấu được ...
Hôm nay lang thang trên internet thấy có đoạn code cắt ảnh khá đơn giản, mình rãnh viết demo cho các bạn tham khảo. Ý tưởng ở công cụ này cũng tương tự như những phần mềm cắt ảnh chuyên nghiệp khác là dùng chuột đánh dấu vùng ảnh cần để cắt. Sau khi đánh dấu được vùng chọn thì bạn lưu lại. Bạn thiết kế form như mình sau:
- Sau khi bạn thiết kế form như trên mình sẽ tiến hành code tuần tự cho các chức năng cắt ảnh, như phần giới thiệu phía trên chủ yếu mình làm việc với các sự kiện đến Mouse. Mình sẽ lần lượt viết các sự kiện liên quan.
Private Sub picCrop_MouseDown(sender As Object, e As MouseEventArgs) Handles picCrop.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 picCrop.Refresh() Catch exc As Exception End Try End Sub
Private Sub picCrop_MouseMove(sender As Object, e As MouseEventArgs) Handles picCrop.MouseMove Try If picCrop.Image Is Nothing Then Exit Sub If e.Button = Windows.Forms.MouseButtons.Left Then picCrop.Refresh() cropWidth = e.X - cropX cropHeight = e.Y - cropY picCrop.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 picCrop_MouseUp(sender As Object, e As MouseEventArgs) Handles picCrop.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(picCrop.Image, picCrop.Width, picCrop.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) picPreview.Image = cropBitmap Catch exc As Exception End Try Catch exc As Exception End Try End Sub
- Sau khi xác đinh được vị trí hình ảnh cần cắt. Bây giờ tiến hành lưu lại hình được cắt. Trước tiên bạn hay viết cho mình hàm lưu lại hình ảnh được cắt như sau:
Public Function SavePhoto(ByVal src As Image, ByVal dest As String, ByVal w As Integer) As Boolean Try Dim imgTmp As System.Drawing.Image Dim imgFoto As System.Drawing.Bitmap imgTmp = src imgFoto = New System.Drawing.Bitmap(w, 225) Dim recDest As New Rectangle(0, 0, w, imgFoto.Height) Dim gphCrop As Graphics = Graphics.FromImage(imgFoto) gphCrop.SmoothingMode = SmoothingMode.HighQuality gphCrop.CompositingQuality = CompositingQuality.HighQuality gphCrop.InterpolationMode = InterpolationMode.High gphCrop.DrawImage(imgTmp, recDest, 0, 0, imgTmp.Width, imgTmp.Height, GraphicsUnit.Pixel) Dim myEncoder As System.Drawing.Imaging.Encoder Dim myEncoderParameter As System.Drawing.Imaging.EncoderParameter Dim myEncoderParameters As System.Drawing.Imaging.EncoderParameters Dim arrayICI() As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders() Dim jpegICI As System.Drawing.Imaging.ImageCodecInfo = Nothing Dim x As Integer = 0 For x = 0 To arrayICI.Length - 1 If (arrayICI(x).FormatDescription.Equals("JPEG")) Then jpegICI = arrayICI(x) Exit For End If Next myEncoder = System.Drawing.Imaging.Encoder.Quality myEncoderParameters = New System.Drawing.Imaging.EncoderParameters(1) myEncoderParameter = New System.Drawing.Imaging.EncoderParameter(myEncoder, 60L) myEncoderParameters.Param(0) = myEncoderParameter imgFoto.Save(dest, jpegICI, myEncoderParameters) imgFoto.Dispose() imgTmp.Dispose() Catch ex As Exception End Try End Function
- Bây giờ bạn quay lại viết cho mình nút "Save" như sau nha:
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click Dim tempFileName As String Dim svdlg As New SaveFileDialog() svdlg.Filter = "JPEG files (*.jpg)|*.jpg|All files (*.*)|*.*" svdlg.FilterIndex = 1 svdlg.RestoreDirectory = True If svdlg.ShowDialog() = Windows.Forms.DialogResult.OK Then tempFileName = svdlg.FileName 'check the file exist else save the cropped image Try Dim img As Image = picPreview.Image SavePhoto(img, tempFileName, 225) Catch exc As Exception MsgBox("Error on Saving: " & exc.Message) End Try End If End Sub
- Thế là xong rồi đấy. Lưu ý với các thánh comment, ứng dụng mình chia sẽ đây là để học hỏi chứ ko phải viết phần mềm xử lý đồ họa như Photoshop, ACDSee, ....À bạn nào làm biếng thì có thể download demo bên dưới nha.
Download Project