- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
Ứng dụng resize ảnh hàng loạt VB.NET
Bài viết này mình sẽ giới thiệu đến các bạn một ứng dụng khá hay do mình sưu tầm được, ứng dụng này có chức năng cho phép resize dung lượng file hình ảnh hàng loạt.
Trước tiên bạn khai Class có tên là ConfigOpt.vb, tại lớp này mình sẽ thiết lập các thuộc tính cho chương trình.
Imports System.IO
' Class for managing configuration persistence
Public Class ConfigOpt
' This DataSet is used as a memory data structure to hold config key/value pairs
' Inside this DataSet, a single DataTable named ConfigValues is created
Private Shared DSoptions As DataSet
' This is the filename for the DataSet XML serialization
Private Shared mConfigFileName As String
' This property is read-only, because it is set through Initialize or Store methods
Public Shared ReadOnly Property ConfigFileName() As String
Get
Return mConfigFileName
End Get
End Property
' This method has to be invoked before using any other method of ConfigOpt class
' ConfigFile parameter is the name of the config file to be read
' (if that file doesn't exists, the method simply initialize the data structure
' and the ConfigFileName property)
Public Shared Sub Initialize(ByVal ConfigFile As String)
mConfigFileName = ConfigFile
DSoptions = New DataSet("ConfigOpt")
If File.Exists(ConfigFile) Then
' If the specified config file exists, it is read to populate the DataSet
DSoptions.ReadXml(ConfigFile)
Else
' If the specified config file doesn't exists,
' the DataSet is simply initialized (and left empty):
' the ConfigValues DataTable is created with two fields (to hold key/values pairs)
Dim dt As New DataTable("ConfigValues")
dt.Columns.Add("OptionName", System.Type.GetType("System.String"))
dt.Columns.Add("OptionValue", System.Type.GetType("System.String"))
DSoptions.Tables.Add(dt)
End If
End Sub
' This method serializes the memory data structure holding the config parameters
' The filename used is the one defined calling Initialize method
Public Shared Sub Store()
Store(mConfigFileName)
End Sub
' Same as Store() method, but with the ability to serialize on a different filename
Public Shared Sub Store(ByVal ConfigFile As String)
mConfigFileName = ConfigFile
DSoptions.WriteXml(ConfigFile)
End Sub
' Read a configuration Value (aka OptionValue), given its Key (aka OptionName)
' If the Key is not defined, an empty string is returned
Public Shared Function GetOption(ByVal OptionName As String) As String
Dim dv As DataView = DSoptions.Tables("ConfigValues").DefaultView
dv.RowFilter = "OptionName='" & OptionName & "'"
If dv.Count > 0 Then
Return CStr(dv.Item(0).Item("OptionValue"))
Else
Return ""
End If
End Function
' Write in the memory data structure a Key/Value pair for a configuration setting
' If the Key already exists, the Value is simply updated, else the Key/Value pair is added
' Warning: to update the written Key/Value pair on the config file, you need to call Store
Public Shared Sub SetOption(ByVal OptionName As String, ByVal OptionValue As String)
Dim dv As DataView = DSoptions.Tables("ConfigValues").DefaultView
dv.RowFilter = "OptionName='" & OptionName & "'"
If dv.Count > 0 Then
dv.Item(0).Item("OptionValue") = OptionValue
Else
Dim dr As DataRow = DSoptions.Tables("ConfigValues").NewRow()
dr("OptionName") = OptionName
dr("OptionValue") = OptionValue
DSoptions.Tables("ConfigValues").Rows.Add(dr)
End If
End Sub
End Class
Ta viết cho sự kiên Input path (đường dẫn đến thư mục chứa hình ảnh) như sau:
Private Sub btnINpath_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnINpath.Click
Dim fBFF As New BrowseForFolder()
fBFF.Description = "Select the folder containing the pictures to be reduced (input folder):"
If fBFF.ShowDialog() = DialogResult.OK Then
txtINpath.Text = fBFF.Path
End If
End Sub
Tiếp theo cho sự kiện Output path (nơi lưu lại các file ảnh sau khi xử lý):
Private Sub btnOUTpath_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOUTpath.Click
Dim fBFF As New BrowseForFolder()
fBFF.Description = "Select the target folder for the reduced pictured (output folder):"
If fBFF.ShowDialog() = DialogResult.OK Then
txtOUTpath.Text = fBFF.Path
End If
End Sub
- Cái quan trọng nhất trong hàm dể resize ta viết như sau:
Private Sub Reduce(ByVal factor As Double)
img = New Bitmap(img, New Size(img.Size.Width * factor, img.Size.Height * factor))
picPhoto.Image = img
Dim SizeKb As String
' To compute: size in Kb
Dim ms As New MemoryStream()
img.Save(ms, Imaging.ImageFormat.Jpeg)
SizeKb = (ms.Length 1024).ToString() & "Kb "
lblCurrentSize.Text = "Current Size: " & SizeKb & "(" & img.Width & "x" & img.Height & ") [" & img.Width / img.Height & "]"
End Sub
- Hàm xử lý lấy thư mục chứa hình ảnh
Private Sub ToFile(ByVal filename As String)
Dim ms As New MemoryStream()
img.Save(ms, Imaging.ImageFormat.Jpeg)
Dim imgData(ms.Length - 1) As Byte
ms.Position = 0
ms.Read(imgData, 0, ms.Length)
Dim fs As New FileStream(filename, FileMode.Create, FileAccess.Write)
fs.Write(imgData, 0, UBound(imgData))
fs.Close()
End Sub
- Hàm xử lý chưa hình ảnh sau khi xử lý
Private Sub FromFile(ByVal filename As String)
Dim fs As New FileStream(filename, FileMode.Open, FileAccess.Read)
Dim imgData(fs.Length) As Byte
fs.Read(imgData, 0, fs.Length)
fs.Close()
Try
img = Image.FromStream(New MemoryStream(imgData))
imgFormat = img.RawFormat
picPhoto.Image = img
lblCurrentSize.Text = "Current Size: " & UBound(imgData) 1024 & "Kb (" & img.Width & "x" & img.Height & ") [" & img.Width / img.Height & "]"
Catch
lblCurrentSize.Text = "Error"
End Try
End Sub
- Hàm sự lý sự kiện xử lý chức năng resize ảnh:
Private Sub btnGo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGo.Click
If Not Directory.Exists(txtINpath.Text) Or Not Directory.Exists(txtOUTpath.Text) Then
MessageBox.Show("The folder you specified as input and/or output path does not exist. Please, check it and retry.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Exit Sub
End If
Dim fs As String() = Directory.GetFiles(txtINpath.Text, "*.jpg")
Dim Ffull, Fshort As String
For Each Ffull In fs
FromFile(Ffull)
Application.DoEvents()
Fshort = Ffull.Substring(Ffull.LastIndexOf("") + 1)
lblName.Text = Fshort
Application.DoEvents()
Dim dr As DialogResult
If chkBatchProc.Checked Then
dr = DialogResult.Yes
Else
dr = MessageBox.Show("Convert?", Fshort, MessageBoxButtons.YesNoCancel)
End If
If dr = DialogResult.Cancel Then
Exit For
ElseIf dr = DialogResult.Yes Then
Reduce(Double.Parse(txtRedFactor.Text, New System.Globalization.CultureInfo("EN-us")))
Application.DoEvents()
ToFile(txtOUTpath.Text & "" & Fshort)
End If
Next
End Sub
Bây giờ bạn thử code để thuowgr thức thành quả của mình xem nào, nếu ai lười quá thì download link bên dưới nhé.