0

گرفتن اندازه و نوع فايل عکس در ويژوال بيسيک

 
papari
papari
کاربر برنزی
تاریخ عضویت : دی 1387 
تعداد پست ها : 314
محل سکونت : تهران

گرفتن اندازه و نوع فايل عکس در ويژوال بيسيک

با استفاده از کلاس (Class) زير مي توانيد عرض (width)، ارتقاع (height)، نوع و color depth عکسي با پسوند JPEG ،GIF ،BMP و PNG را بگيريد.

ابتدا در پروژه ويژوال بيسيک، در منوي Project گزينه Add Module را بزنيد. سپس کدهاي زير را کپي (Copy) و در آنجا Paste کنيد.

Option Explicit

' Only the first X bytes of the file are read into a byte array.
' BUFFERSIZE is X.  A larger number will use more memory and
' be slower.  A smaller number may not be able to decode all
' JPEG files.  Feel free to play with this number.
Private Const BUFFERSIZE As Long = 65535

' image type enum
Public Enum eImageType
    itUNKNOWN = 0
    itGIF = 1
    itJPEG = 2
    itPNG = 3
    itBMP = 4
End Enum

' private member variables
Private m_Width As Long
Private m_Height As Long
Private m_Depth As Byte
Private m_ImageType As eImageType

' read-only properties

Public Property Get imgWidth() As Long
    imgWidth = m_Width
End Property

Public Property Get imgHeight() As Long
    imgHeight = m_Height
End Property

Public Property Get imgDepth() As Byte
    imgDepth = m_Depth
End Property

Public Property Get ImageType() As eImageType
    ImageType = m_ImageType
End Property

Public Sub ReadImageInfo(sFileName As String)
' This is the sub to call to retrieve information on a file.
   
    ' Byte array buffer to store part of the file
    Dim bBuf(BUFFERSIZE) As Byte
    ' Open file number
    Dim iFN As Integer
   
    ' Set all properties to default values
    m_Width = 0
    m_Height = 0
    m_Depth = 0
    m_ImageType = itUNKNOWN
   
    ' here we will load the first part of a file into a byte
    'array the amount of the file stored here depends on
    'the BUFFERSIZE constant
    iFN = FreeFile
    Open sFileName For Binary As iFN
    Get #iFN, 1, bBuf()
    Close iFN
   
    If bBuf(0) = 137 And bBuf(1) = 80 And bBuf(2) = 78 Then
    ' this is a PNG file
   
        m_ImageType = itPNG
       
        ' get bit depth
        Select Case bBuf(25)
            Case 0
            ' greyscale
                m_Depth = bBuf(24)
               
            Case 2
            ' RGB encoded
                m_Depth = bBuf(24) * 3
               
            Case 3
            ' Palette based, 8 bpp
                m_Depth = 8
               
            Case 4
            ' greyscale with alpha
                m_Depth = bBuf(24) * 2
               
            Case 6
            ' RGB encoded with alpha
                m_Depth = bBuf(24) * 4
               
            Case Else
            ' This value is outside of it's normal range, so
            'we'll assume
            ' that this is not a valid file
                m_ImageType = itUNKNOWN
               
        End Select
       
        If m_ImageType Then
        ' if the image is valid then
       
            ' get the width
            m_Width = Mult(bBuf(19), bBuf(18))
           
            ' get the height
            m_Height = Mult(bBuf(23), bBuf(22))
        End If
       
    End If
   
    If bBuf(0) = 71 And bBuf(1) = 73 And bBuf(2) = 70 Then
    ' this is a GIF file
       
        m_ImageType = itGIF
       
        ' get the width
        m_Width = Mult(bBuf(6), bBuf(7))
       
        ' get the height
        m_Height = Mult(bBuf(8), bBuf(9))
       
        ' get bit depth
        m_Depth = (bBuf(10) And 7) + 1
    End If
   
    If bBuf(0) = 66 And bBuf(1) = 77 Then
    ' this is a BMP file
   
        m_ImageType = itBMP
       
        ' get the width
        m_Width = Mult(bBuf(18), bBuf(19))
       
        ' get the height
        m_Height = Mult(bBuf(22), bBuf(23))
       
        ' get bit depth
        m_Depth = bBuf(28)
    End If

    If m_ImageType = itUNKNOWN Then
    ' if the file is not one of the above type then
    ' check to see if it is a JPEG file
        Dim lPos As Long
       
        Do
        ' loop through looking for the byte sequence FF,D8,FF
        ' which marks the begining of a JPEG file
        ' lPos will be left at the postion of the start
            If (bBuf(lPos) = &HFF And bBuf(lPos + 1) = &HD8 _
                 And bBuf(lPos + 2) = &HFF) _
                 Or (lPos >= BUFFERSIZE - 10) Then Exit Do
           
            ' move our pointer up
            lPos = lPos + 1
           
        ' and continue
        Loop
       
        lPos = lPos + 2
        If lPos >= BUFFERSIZE - 10 Then Exit Sub
       
       
        Do
        ' loop through the markers until we find the one
        'starting with FF,C0 which is the block containing the
        'image information
       
            Do
            ' loop until we find the beginning of the next marker
                If bBuf(lPos) = &HFF And bBuf(lPos + 1) _
               <> &HFF Then Exit Do
                lPos = lPos + 1
                If lPos >= BUFFERSIZE - 10 Then Exit Sub
            Loop
           
            ' move pointer up
            lPos = lPos + 1
           
            Select Case bBuf(lPos)
                Case &HC0 To &HC3, &HC5 To &HC7, &HC9 To &HCB, _
                &HCD To &HCF
                ' we found the right block
                    Exit Do
            End Select
           
            ' otherwise keep looking
            lPos = lPos + Mult(bBuf(lPos + 2), bBuf(lPos + 1))
           
            ' check for end of buffer
            If lPos >= BUFFERSIZE - 10 Then Exit Sub
           
        Loop
       
        ' If we've gotten this far it is a JPEG and we are ready
        ' to grab the information.
       
        m_ImageType = itJPEG
       
        ' get the height
        m_Height = Mult(bBuf(lPos + 5), bBuf(lPos + 4))
       
        ' get the width
        m_Width = Mult(bBuf(lPos + 7), bBuf(lPos + 6))
       
        ' get the color depth
        m_Depth = bBuf(lPos + 8) * 8
       
    End If
   
End Sub
Private Function Mult(lsb As Byte, msb As Byte) As Long
    Mult = lsb + (msb * CLng(256))
End Function


براي استفاده از اين ماژول، کافيست مسير عکس را در سابروتين ReadImageInfo بعنوان ورودي داده و با استفاده از توابع زير، مشخصات آنرا بگيريد:
imgWidth: عرض
imgHeight: ارتفاع
imgDepth: عمق رنگ

ImageType: نوع فايل عکس که برابر يکي از شماره هاي زير است:
0 = نامعين
GIF = 1
JPEG = 2
PNG = 3
BMP = 4

مثال:
در قسمت Form پروژه، يک دکمه (CommandButton) با نام Command1 ايجاد کنيد. فرض کنيد در درايو \:C، فايلي با نام image.gif قرار دارد. کدهاي زير را در بخش کد Form وارد کنيد.

Private Sub Command1_Click()
  Dim strImageType As String

  Call ReadImageInfo("c:\image.gif")
 
  Select Case ImageType()
   Case 0: strImageType = "UNKNOWN"
   Case 1: strImageType = "GIF"
   Case 2: strImageType = "JPEG"
   Case 3: strImageType = "PNG"
   Case 4: strImageType = "BMP"
  End Select

  MsgBox "Width: " & imgWidth() & vbCrLf & _
          "Height: " & imgHeight() & vbCrLf & _
          "Color Depth: " & imgDepth() & vbCrLf & _
          "Type: " & strImageType & vbCrLf

End Sub


- در خط دوم، متغيري با نام strImageType از نوع رشته براي ذخيره نوع فايل عکس مشخص نموديم.
- در خط سوم، فايل c:\image.gif را با استفاده از تابع ReadImageInfo مي خوانيم.
- در خط چهارم تا دهم، با استفاده از دستور Select، خروجي تابع ImageType که مربوط به نوع فايل است را بررسي مي کنيم و نوع فايل را در متغير strImageType قرار ميدهيم.
- در خط يازدهم، با استفاده از دستور MsgBox، مشخصات گرفته شده را نمايش ميدهيم.
 
منبع خبر: www.miyoonbor.com
و این جهان پر از صدای پای مردمی است که همچنانکه تو را می بوسند در ذهن خود طناب دارت را می بافند.
دوشنبه 17 فروردین 1388  5:26 PM
تشکرات از این پست
دسترسی سریع به انجمن ها