Đ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
‘ 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