Đoạn code VB mẫu dùng cho việc load ảnh và hiển thị vào PictureBox1
Xin hỏi về định dạng ảnh JPG, BMP..., cách thức truy xuất file ảnh và giải
thuật cắt ảnh thành nhiều phần
Tôi muốn viết 1 chương trình có chức năng như sau (bằng Delphi hay VB):
• Chương trình sẽ thực hiện load 1 ảnh lên picturebox trên Form.
• Sau đó tiến hành chia ảnh thành nhiều phần và hiển thị riêng biệt (như trong
các trò chơi ghép tranh).
• Người chơi có thể di chuyển các phần ảnh đến vị trí mong muốn trên Form.
Đáp:
Thông tin về định dạng file ảnh *.jpg, *.bmp... có thể tìm thấy trên Internet, tuy nhiên việc tìm
hiểu và nắm vững định dạng file ảnh (nhất là định dạng phức tạp như jpg, gif...) sẽ rất khó khăn
và tốn nhiều thời gian. Do đó bạn nên cố gắng dùng lại các thư viện và linh kiện phần mềm hỗ
trợ việc xử lý file ảnh trong khi viết ứng dụng của mình. Cụ thể để viết 1 chương trình có các
chức năng mà bạn yêu cầu, bạn chỉ cần dùng các hàm API của Windows (hay các hàm của VB)
là đủ. Cụ thể, nếu bạn dùng VB và dùng các hàm API của Windows để viết ứng dụng thì:
• Việc load ảnh và hiển thị vào PictureBox1 có thể thực hiện bởi đoạn code VB mẫu như sau:
‘Khai báo hằng cần dùng
Private Const LR_LOADFROMFILE = 16 ‘ used with LoadImage
Private Const SRCCOPY = &HCC0020 ‘ used to determine how a blit
Private Const IMAGE_BITMAP = &O0 ‘ used with LoadImage to load a
Private Const LR_CREATEDIBSECTION = 8192 ‘ used with LoadImage
‘khai báo kiểu BITMAP
Private Type BITMAP
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type
‘khai báo các hàm API cần dùng
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long,
ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long,
ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2
As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As
Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long,
ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long,
ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long,ByVal x As Long, ByVal
y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal
xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long,
ByVal dwRop As Long) As Long
Private Sub btnLoad_Click()
Dim hBitmap As Long ‘ handle của bitmap cần nạp vào
Dim lResult As Long ‘ biến chứa kết quả gọi hàm API
Dim sFileName As String ‘ tên file chứa ảnh
Dim BitmapData As BITMAP ‘ biến chứa thông tin về ảnh
Dim iImageDC As Long ‘ DC chứa ảnh bitmap
‘ thiết lập đường dẫn của file ảnh
sFileName = "c:\windows\winnt256.bmp"
‘ nạp ảnh từ file vào bộ nhớ.
hBitmap = LoadImage(0, sFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)
If (hBitmap = 0) Then
MsgBox "Error : Unable To Load Bitmap Image : " & sFileName, _
vbOKOnly, "Bitmap Load Error"
Exit Sub
End If
‘tạo đối tượng chứa thông tin ảnh
lResult = GetObject(hBitmap, Len(BitmapData), BitmapData)
If (lResult = 0) Then Exit Sub
‘tạo 1 device context (DC) tạm chứa ảnh
iImageDC = CreateCompatibleDC(0)
If (iImageDC = 0) Then Exit Sub
‘cất ảnh vào device context
lResult = SelectObject(iImageDC, hBitmap)
If (lResult = 0) Then Exit Sub
‘thiết lập đơn vị đo theo pixel
Picture1.ScaleMode = vbPixels
‘vẽ ảnh từ DC sang PictureBox1, có scale từ kích thước thực về kích thước của PictureBox
lResult = StretchBlt(Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, iImageDC, 0,
0, BitmapData.bmWidth, BitmapData.bmHeight, SRCCOPY)
End Sub
• Việc copy 1 vùng ảnh từ DC này sang DC khác có thể thực hiện bởi đoạn code VB mẫu như
sau:
Private Sub btnCopy_Click()
Dim x As Integer
Dim y As Integer
Dim lResult As Long
‘khởi động qui trình tính số ngẫu nhiên
‘tìm vị trí ngẫu nhiên của vùng ảnh trong PictureBox1 cần copy
x = Int((Picture1.ScaleWidth - 100) * Rnd)
y = Int((Picture1.ScaleHeight - 100) * Rnd)
‘copy vùng ảnh hình vuông (100,100) ở toạ độ x,y của PictureBox1 sang góc trên trái của
PictureBox2
lResult = BitBlt(Picture2.hdc, 0, 0, 100, 100, Picture1.hdc, x, y, SRCCOPY)
End Sub