Đon code VB mu dùng cho vic load nh và hin th vào PictureBox1
Xin hi v định dng nh JPG, BMP..., cách thc truy xut file nh và gii
thut ct nh thành nhiu phn
Tôi mun viết 1 chương trình có chc năng như sau (bng Delphi hay VB):
• Chương trình s thc hin load 1 nh lên picturebox trên Form.
• Sau đó tiến hành chia nh thành nhiu phn và hin th riêng bit (như trong
các trò chơi ghép tranh).
• Người chơi có th di chuyn các phn nh đến v trí mong mun trên Form.
Đáp:
Thông tin v định dng file nh *.jpg, *.bmp... có th tìm thy trên Internet, tuy nhiên vic tìm
hiu và nm vng định dng file nh (nht là định dng phc tp như jpg, gif...) s rt khó khăn
và tn nhiu thi gian. Do đó bn nên c gng dùng li các thư vin và linh kin phn mm h
tr vic x lý file nh trong khi viết ng dng ca mình. C th để viết 1 chương trình có các
chc năng mà bn yêu cu, bn ch cn dùng các hàm API ca Windows (hay các hàm ca VB)
đủ. C th, nếu bn dùng VB và dùng các hàm API ca Windows để viết ng dng thì:
• Vic load nh và hin th vào PictureBox1 có th thc hin bi đon code VB mu như sau:
‘Khai báo hng cn 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 kiu 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 cn 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 ca bitmap cn np vào
Dim lResult As Long ‘ biến cha kết qu gi hàm API
Dim sFileName As String ‘ tên file cha nh
Dim BitmapData As BITMAP ‘ biến cha thông tin v nh
Dim iImageDC As Long ‘ DC cha nh bitmap
‘ thiết lp đường dn ca file nh
sFileName = "c:\windows\winnt256.bmp"
‘ np 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
‘to đối tượng cha thông tin nh
lResult = GetObject(hBitmap, Len(BitmapData), BitmapData)
If (lResult = 0) Then Exit Sub
‘to 1 device context (DC) tm cha nh
iImageDC = CreateCompatibleDC(0)
If (iImageDC = 0) Then Exit Sub
‘ct nh vào device context
lResult = SelectObject(iImageDC, hBitmap)
If (lResult = 0) Then Exit Sub
‘thiết lp đơn v đo theo pixel
Picture1.ScaleMode = vbPixels
‘v nh t DC sang PictureBox1, có scale t kích thước thc v kích thước ca PictureBox
lResult = StretchBlt(Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, iImageDC, 0,
0, BitmapData.bmWidth, BitmapData.bmHeight, SRCCOPY)
End Sub
• Vic copy 1 vùng nh t DC này sang DC khác có th thc hin bi đon code VB mu như
sau:
Private Sub btnCopy_Click()
Dim x As Integer
Dim y As Integer
Dim lResult As Long
‘khi động qui trình tính s ngu nhiên
‘tìm v trí ngu nhiên ca vùng nh trong PictureBox1 cn 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 ca PictureBox1 sang góc trên trái ca
PictureBox2
lResult = BitBlt(Picture2.hdc, 0, 0, 100, 100, Picture1.hdc, x, y, SRCCOPY)
End Sub