logo

Đoạn code VB mẫu dùng cho việc load ảnh và hiển thị vào PictureBox1


Đ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  
DMCA.com Protection Status Copyright by webtailieu.net