• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Lấy kích thước (width, height) của hình ảnh

Các thủ thuật về âm thanh, đồ họa, truyền thông đa phương tiện...
Hình đại diện của người dùng
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 1641
Ngày tham gia: T.Tư 16/04/2008 11:25 am
Đến từ: Chợ Lách - Bến Tre
Been thanked: 31 time
Liên hệ:

Lấy kích thước (width, height) của hình ảnh

Gửi bàigửi bởi clarkkent » T.Năm 23/07/2009 2:31 pm

Thủ thuật: Lấy kích thước (width, height) của hình ảnh
Tác giả: Sưu tầm 4rum - gửi bởi Kasper » T.Tư 03/12/2008 10:46 am
Mô tả: Lấy kích thước (width, height) của hình ảnh



Class

Mã: Chọn hết

  1. Option Explicit
  2.  
  3. ' Only the first X bytes of the file are read into a byte array.
  4. ' BUFFERSIZE is X.  A larger number will use more memory and
  5. ' be slower.  A smaller number may not be able to decode all
  6. ' JPEG files.  Feel free to play with this number.
  7. Private Const BUFFERSIZE As Long = 65535
  8.  
  9. ' image type enum
  10. Public Enum eImageType
  11.     itUNKNOWN = 0
  12.     itGIF = 1
  13.     itJPEG = 2
  14.     itPNG = 3
  15.     itBMP = 4
  16. End Enum
  17.  
  18. ' private member variables
  19. Private m_Width As Long
  20. Private m_Height As Long
  21. Private m_Depth As Byte
  22. Private m_ImageType As eImageType
  23.  
  24.  
  25.  
  26. '
  27. ' CImageInfo
  28. '
  29. ' Author: David Crowell
  30. ' davidc@qtm.net
  31. ' http://www.qtm.net/~davidc
  32. '
  33. ' Released to the public domain
  34. ' use however you wish
  35. '
  36. ' CImageInfo will get the image type ,dimensions, and
  37. ' color depth from JPG, PNG, BMP, and GIF files.
  38. '
  39. ' version date: June 16, 1999
  40. '
  41. ' http://www.wotsit.org is a good source of
  42. ' file format information.  This code would not have been
  43. ' possible without the files I found there.
  44. '
  45.  
  46. ' read-only properties
  47.  
  48. Public Property Get Width() As Long
  49.     Width = m_Width
  50. End Property
  51.  
  52. Public Property Get Height() As Long
  53.     Height = m_Height
  54. End Property
  55.  
  56. Public Property Get Depth() As Byte
  57.     Depth = m_Depth
  58. End Property
  59.  
  60. Public Property Get ImageType() As eImageType
  61.     ImageType = m_ImageType
  62. End Property
  63.  
  64. Public Sub ReadImageInfo(sFileName As String)
  65. ' This is the sub to call to retrieve information on a file.
  66.    
  67.     ' Byte array buffer to store part of the file
  68.     Dim bBuf(BUFFERSIZE) As Byte
  69.     ' Open file number
  70.     Dim iFN As Integer
  71.    
  72.     ' Set all properties to default values
  73.     m_Width = 0
  74.     m_Height = 0
  75.     m_Depth = 0
  76.     m_ImageType = itUNKNOWN
  77.    
  78.     ' here we will load the first part of a file into a byte
  79. 'array the amount of the file stored here depends on
  80. 'the BUFFERSIZE constant
  81.     iFN = FreeFile
  82.     Open sFileName For Binary As iFN
  83.     Get #iFN, 1, bBuf()
  84.     Close iFN
  85.    
  86.     If bBuf(0) = 137 And bBuf(1) = 80 And bBuf(2) = 78 Then
  87.     ' this is a PNG file
  88.    
  89.         m_ImageType = itPNG
  90.        
  91.         ' get bit depth
  92.         Select Case bBuf(25)
  93.             Case 0
  94.             ' greyscale
  95.                 m_Depth = bBuf(24)
  96.                
  97.             Case 2
  98.             ' RGB encoded
  99.                 m_Depth = bBuf(24) * 3
  100.                
  101.             Case 3
  102.             ' Palette based, 8 bpp
  103.                 m_Depth = 8
  104.                
  105.             Case 4
  106.             ' greyscale with alpha
  107.                 m_Depth = bBuf(24) * 2
  108.                
  109.             Case 6
  110.             ' RGB encoded with alpha
  111.                 m_Depth = bBuf(24) * 4
  112.                
  113.             Case Else
  114.             ' This value is outside of it's normal range, so
  115.             'we'll assume
  116.             ' that this is not a valid file
  117.                 m_ImageType = itUNKNOWN
  118.                
  119.         End Select
  120.        
  121.         If m_ImageType Then
  122.         ' if the image is valid then
  123.        
  124.             ' get the width
  125.             m_Width = Mult(bBuf(19), bBuf(18))
  126.            
  127.             ' get the height
  128.             m_Height = Mult(bBuf(23), bBuf(22))
  129.         End If
  130.        
  131.     End If
  132.    
  133.     If bBuf(0) = 71 And bBuf(1) = 73 And bBuf(2) = 70 Then
  134.     ' this is a GIF file
  135.        
  136.         m_ImageType = itGIF
  137.        
  138.         ' get the width
  139.         m_Width = Mult(bBuf(6), bBuf(7))
  140.        
  141.         ' get the height
  142.         m_Height = Mult(bBuf(8), bBuf(9))
  143.        
  144.         ' get bit depth
  145.         m_Depth = (bBuf(10) And 7) + 1
  146.     End If
  147.    
  148.     If bBuf(0) = 66 And bBuf(1) = 77 Then
  149.     ' this is a BMP file
  150.    
  151.         m_ImageType = itBMP
  152.        
  153.         ' get the width
  154.         m_Width = Mult(bBuf(18), bBuf(19))
  155.        
  156.         ' get the height
  157.         m_Height = Mult(bBuf(22), bBuf(23))
  158.        
  159.         ' get bit depth
  160.         m_Depth = bBuf(28)
  161.     End If
  162.  
  163.     If m_ImageType = itUNKNOWN Then
  164.     ' if the file is not one of the above type then
  165.     ' check to see if it is a JPEG file
  166.         Dim lPos As Long
  167.        
  168.         Do
  169.         ' loop through looking for the byte sequence FF,D8,FF
  170.         ' which marks the begining of a JPEG file
  171.         ' lPos will be left at the postion of the start
  172.             If (bBuf(lPos) = &HFF And bBuf(lPos + 1) = &HD8 _
  173.                  And bBuf(lPos + 2) = &HFF) _
  174.                  Or (lPos >= BUFFERSIZE - 10) Then Exit Do
  175.            
  176.             ' move our pointer up
  177.             lPos = lPos + 1
  178.            
  179.         ' and continue
  180.         Loop
  181.        
  182.         lPos = lPos + 2
  183.         If lPos >= BUFFERSIZE - 10 Then Exit Sub
  184.        
  185.        
  186.         Do
  187. ' loop through the markers until we find the one
  188. 'starting with FF,C0 which is the block containing the
  189. 'image information
  190.        
  191.             Do
  192.             ' loop until we find the beginning of the next marker
  193.                 If bBuf(lPos) = &HFF And bBuf(lPos + 1) _
  194.                <> &HFF Then Exit Do
  195.                 lPos = lPos + 1
  196.                 If lPos >= BUFFERSIZE - 10 Then Exit Sub
  197.             Loop
  198.            
  199.             ' move pointer up
  200.             lPos = lPos + 1
  201.            
  202.             Select Case bBuf(lPos)
  203.                 Case &HC0 To &HC3, &HC5 To &HC7, &HC9 To &HCB, _
  204.                 &HCD To &HCF
  205.                 ' we found the right block
  206.                     Exit Do
  207.             End Select
  208.            
  209.             ' otherwise keep looking
  210.             lPos = lPos + Mult(bBuf(lPos + 2), bBuf(lPos + 1))
  211.            
  212.             ' check for end of buffer
  213.             If lPos >= BUFFERSIZE - 10 Then Exit Sub
  214.            
  215.         Loop
  216.        
  217.         ' If we've gotten this far it is a JPEG and we are ready
  218.         ' to grab the information.
  219.        
  220.         m_ImageType = itJPEG
  221.        
  222.         ' get the height
  223.         m_Height = Mult(bBuf(lPos + 5), bBuf(lPos + 4))
  224.        
  225.         ' get the width
  226.         m_Width = Mult(bBuf(lPos + 7), bBuf(lPos + 6))
  227.        
  228.         ' get the color depth
  229.         m_Depth = bBuf(lPos + 8) * 8
  230.        
  231.     End If
  232.    
  233. End Sub
  234.  
  235. Private Function Mult(lsb As Byte, msb As Byte) As Long
  236.     Mult = lsb + (msb * CLng(256))
  237. End Function
  238.  


Sử dụng:

Mã: Chọn hết

  1.      Dim cInfo As New CImageInfo
  2.  
  3.     cInfo.ReadImageInfo "Đường dẫn hình"
  4.     MsgBox cInfo.Width & " - " & cInfo.Height


• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...

Hình đại diện của người dùng
T7
Thành viên danh dự
Thành viên danh dự
Bài viết: 415
Ngày tham gia: T.Năm 24/05/2007 8:19 pm
Đến từ: Long Xuyên - An Giang
Been thanked: 12 time
Liên hệ:

Re: Lấy kích thước (width, height) của hình ảnh

Gửi bàigửi bởi T7 » T.Năm 23/07/2009 3:37 pm

Ọc, xem này =))

Mã: Chọn hết

  1. Dim a As IPictureDisp
  2. Set a = LoadPicture("<Đường dẫn file ảnh>")
  3. MsgBox Round(a.Width * 24 / 635, 0) & " - " & Round(a.Height * 24 / 635, 0)
While (i <= you) i++;


Quay về “[VB] Âm thanh và Đồ họa”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách