Autoitnál hogy oldható meg, hogy ne programlistában hívjunk meg a "nev () " kifejezéssel egy "func nev () " és "endfunc" kifejezés között levő programlistában levő részt? Hanem egy önálló autoit fáljt hívjunk meg.
Az első válasz lesz az amire gondolok, természetesen a Te válaszod is cél csak most ép nem erre gondoltam. Az zavar be, hogy a minta az image_get_info.au3 file ami #include "image_get_info.au3" utasítással van meghatározva, a mappában image_get_info.au3-ként szerepel, a program azonban $aInfo = _ImageGetInfo($fotofile) utasítással hívja meg. Nem értem hogy hogy hivja meg alsóvonalakkal elválasztások nélküli névvel mikor a file nevében ott vannak ezek az első vonalak, a meghiváskor azonban alsó vonalakkal kezdődik, miközben a filenév nem.
Magában az image_get_info.au3 fileben viszont ott van a függvény, a 22.sorban, "Func _ImageGetInfo($sFile)" programsor részeként. Most akkor az #include parancs egy mappában vagy az autoit gyökérben levő file-ben levő függvényt hív meg, nem pedig magát a file-t?
;===============================================================================
;
; Description: Return JPEG, TIFF, BMP, PNG and GIF image common info:
; Size, Color Depth, Resolution etc. For JPEG files retreive
; additional information from exif tag (if exists).
; Parameter(s): File name
; Requirement(s): Autoit 3.3.0.0
; Return Value(s): On Success - string in format:
; ParamName=ParamValue
; Pairs are separated by LF char. For getting data can be used
; function _ImageGetParam($sData, $sParam), where
; $sData - string, returned by _ImageGetInfo
; $sParam - param name, for ex. Width
; On Failure sets @ERROR:
; 1 - Can't open image
; Return string become empty if no info found
; Author(s): Dmitry Yudin (Lazycat)
; Version: 2.8
; Date: 08.10.2010
;
;===============================================================================
Func _ImageGetInfo($sFile)
Local $sInfo = "", $hFile, $nClr
Local $ret = DllCall("kernel32.dll","int","CreateFile", _
"str",$sFile, _
"int",0x80000000, _
"int",0, _
"ptr",0, _
"int",3, _
"int",0x80, _
"ptr",0)
If @error OR Not $ret[0] Then
SetError(1)
Return ""
Endif
Local $hFile = $ret[0]
Local $p = _FileReadToStruct("ubyte[54]", $hFile, 0)
Local $asIdent[8] = [7, Chr(0xFF) & Chr(0xD8), "BM", Chr(0x89) & "PNG" & Chr(0x0D) & Chr(0x0A) & Chr(0x1A) & Chr(0x0A), "GIF89", "GIF87", "II", "MM"]
For $i = 1 To $asIdent[0]
If _DllStructArrayAsString($p, 1, StringLen($asIdent[$i])) = $asIdent[$i] Then
Select
Case $i = 1 ; JPEG
$sInfo = _ImageGetInfoJPG($hFile, FileGetSize($sFile))
Exitloop
Case $i = 2 ; BMP
$t = DllStructCreate("int;int;short;short;dword;dword;dword;dword", DllStructGetPtr($p, 1) + 18)
_Add($sInfo, "Width", DllStructGetData($t, 1))
_Add($sInfo, "Height", DllStructGetData($t, 2))
_Add($sInfo, "ColorDepth", DllStructGetData($t, 4))
_Add($sInfo, "XResolution", Round(DllStructGetData($t, 7)/39.37))
_Add($sInfo, "YResolution", Round(DllStructGetData($t, 8)/39.37))
_Add($sInfo, "ResolutionUnit", "Inch")
Exitloop
Case $i = 3 ; PNG
$sInfo = _ImageGetInfoPNG($hFile, FileGetSize($sFile))
Exitloop
Case ($i = 4) or ($i = 5) ; GIF
$t = DllStructCreate("short;short;ubyte", DllStructGetPtr($p, 1) + 6)
_Add($sInfo, "Width", DllStructGetData($t, 1))
_Add($sInfo, "Height", DllStructGetData($t, 2))
$nClr = DllStructGetData($t, 3)
_Add($sInfo, "ColorDepth", _IsBitSet($nClr, 0) + _IsBitSet($nClr, 1)*2 + _IsBitSet($nClr, 2)*4 + 1)
Exitloop
Case $i = 6 ; TIFF II
$sInfo = _ImageGetInfoTIFF($hFile, 0)
Exitloop
Case $i = 7 ; TIFF MM
$sInfo = _ImageGetInfoTIFF($hFile, 1)
Exitloop
EndSelect
Endif
Next
DllCall("kernel32.dll","int","CloseHandle","int", $hFile)
$p = 0
Return($sInfo)
EndFunc
;===============================================================================
; PNG Parser
;===============================================================================
Func _ImageGetInfoPNG($hFile, $nFileSize)
Local $sInfo = "", $nNextOffset = 8, $nBlockSize, $nID = 0
Local $nBPP, $nCol, $sAlpha, $nXRes, $nYRes, $sKeyword, $nKWLen
Local $pBlockID = DllStructCreate("ulong;ulong")
While $nID <> 0x49454E44 ; IEND
$pBlockID = _FileReadToStruct($pBlockID, $hFile, $nNextOffset)
$nBlockSize = _IntR(DllStructGetData($pBlockID, 1))
If $nBlockSize > $nFileSize Then Return SetError(1, 0, $sInfo)
$nID = _IntR(DllStructGetData($pBlockID, 2))
Select
Case $nID = 0x49484452 ; IHDR
$t = _FileReadToStruct("ulong;ulong;byte;byte;byte;byte;byte", $hFile, $nNextOffset + 8)
_Add($sInfo, "Width", _IntR(DllStructGetData($t, 1)))
_Add($sInfo, "Height", _IntR(DllStructGetData($t, 2)))
$nBPP = DllStructGetData($t, 3)
$nCol = DllStructGetData($t, 4)
$sAlpha = ""
If $nCol > 3 Then
$nCol = $nCol - 4
$sAlpha = " + alpha"
Endif
If $nCol < 3 Then $nBPP = ($nCol + 1) * $nBPP
_Add($sInfo, "ColorDepth", $nBPP & $sAlpha)
_Add($sInfo, "Interlace", DllStructGetData($t, 7))
Case $nID = 0x70485973 ; pHYs
$t = _FileReadToStruct("ulong;ulong;ubyte", $hFile, $nNextOffset + 8)
$nXRes = _IntR(DllStructGetData($t, 1))
$nYRes = _IntR(DllStructGetData($t, 2))
If DllStructGetData($t, 3) = 1 Then
$nXRes = Round($nXRes/39.37)
$nYRes = Round($nYRes/39.37)
Endif
_Add($sInfo, "XResolution", $nXRes)
_Add($sInfo, "YResolution", $nYRes)
_Add($sInfo, "ResolutionUnit", "Inch")
Case $nID = 0x74455874 ; tEXt
$t = _FileReadToStruct("char[80]", $hFile, $nNextOffset + 8)
$sKeyword = DllStructGetData($t, 1)
$nKWLen = StringLen($sKeyword) + 1
$t = _FileReadToStruct("char[" & $nBlockSize - $nKWLen & "]", $hFile, $nNextOffset + 8 + $nKWLen)
_Add($sInfo, $sKeyword, DllStructGetData($t, 1))
Case $nID = 0x74494D45 ; tIME
$t = _FileReadToStruct("ushort,ubyte,ubyte,ubyte,ubyte,ubyte", $hFile, $nNextOffset + 8)
_Add($sInfo, "DateTime", StringFormat("%4d:%02d:%02d %02d:%02d:%02d", _
DllStructGetData($t, 1), DllStructGetData($t, 2), _
DllStructGetData($t, 3), DllStructGetData($t, 4), _
DllStructGetData($t, 5), DllStructGetData($t, 6)))
EndSelect
$nNextOffset = $nNextOffset + 12 + $nBlockSize ; 12 = data size + data header + crc32 size
$t = 0
Wend
Return $sInfo
EndFunc
;===============================================================================
; JPEG Parser
;===============================================================================
Func _ImageGetInfoJPG($hFile, $nFileSize)
Local $anSize[2], $sData, $sSeg, $nPos = 2, $sInfo = ""
Local $sUnit = "Pixel", $nMarker = 0, $nComLen
Local $p = DllStructCreate("ubyte;ubyte;ushort;byte[128]")
While ($nMarker <> 0xDA) and ($nPos < $nFileSize)
$p = _FileReadToStruct($p, $hFile, $nPos)
If DllStructGetData($p, 1) = 0xFF Then ; Valid segment start
$nMarker = DllStructGetData($p, 2)
Select
Case ($nMarker = 0xC0) or ($nMarker = 0xC1) or ($nMarker = 0xC2) or _
($nMarker = 0xC3) or ($nMarker = 0xC5) or ($nMarker = 0xC6) or _
($nMarker = 0xC7) or ($nMarker = 0xCB) or ($nMarker = 0xCD) or _
($nMarker = 0xCE) or ($nMarker = 0xCF)
$t = DllStructCreate("align 1;byte;ushort;ushort", DllStructGetPtr($p, 4))
_Add($sInfo, "Width", _IntR(DllStructGetData($t, 3)))
_Add($sInfo, "Height", _IntR(DllStructGetData($t, 2)))
Case $nMarker = 0xE0 ; JFIF header
$t = DllStructCreate("byte[5];byte;byte;ubyte;ushort;ushort", DllStructGetPtr($p, 4))
$nUnit = _IntR(DllStructGetData($t, 4))
If $nUnit = 1 Then
$sUnit = "Inch"
ElseIf $nUnit = 2 Then
$sUnit = "Cm"
EndIf
_Add($sInfo, "XResolution", _IntR(DllStructGetData($t, 5)))
_Add($sInfo, "YResolution", _IntR(DllStructGetData($t, 6)))
_Add($sInfo, "ResolutionUnit", $sUnit)
Case $nMarker = 0xE1 ; EXIF segment
$sInfo = $sInfo & ParseExif($hFile, $nPos)
Case $nMarker = 0xFE ; Comment segment
$nComLen = _IntR(DllStructGetData($p, 3)) - 2
$t = _FileReadToStruct("byte[" & $nComLen & "]", $hFile, $nPos + 4)
_Add($sInfo, "Comment", _DllStructArrayAsString($t, 1, $nComLen))
$t = 0
Case Else
EndSelect
$nPos= $nPos + _IntR(DllStructGetData($p, 3)) + 2
Else
ExitLoop
Endif
Wend
$p = 0
Return($sInfo)
EndFunc
;===============================================================================
; TIFF Parser
;===============================================================================
Func _ImageGetInfoTIFF($hFile, $nByteOrder)
Local $pHdr, $nTagsOffset, $pCount, $nFieldCount, $pTag, $id
Local $anSize[2], $pos = 2, $sInfo = "", $aTag[1][2]
_AddPair($aTag, 0x0100, "Width")
_AddPair($aTag, 0x0101, "Height")
_AddPair($aTag, 0x011A, "XResolution")
_AddPair($aTag, 0x011B, "YResolution")
_AddPair($aTag, 0x0132, "DateTime")
_AddPair($aTag, 0x0131, "Software")
_AddPair($aTag, 0x8298, "Copyright")
$pHdr = _FileReadToStruct("short;short;dword", $hFile, 0)
$nTagsOffset = _IntR(DllStructGetData($pHdr, 3), $nByteOrder)
$pCount = _FileReadToStruct("ushort", $hFile, $nTagsOffset)
$nFieldCount = _IntR(DllStructGetData($pCount, 1), $nByteOrder)
$pTag = DllStructCreate("ushort;ushort;ulong;ulong")
For $i = 0 To $nFieldCount - 1
$pTag = _FileReadToStruct($pTag, $hFile, $nTagsOffset + 2 + 12 * $i)
$id = _IntR(DllStructGetData($pTag, 1), $nByteOrder)
For $j = 1 To $aTag[0][0]
If $aTag[$j][0] = $id Then
_Add($sInfo, $aTag[$j][1], _ReadTag($hFile, $pTag, 0, $nByteOrder)) ; Tiff header at 0 offset
Exitloop
Endif
Next
If $id = 0x0102 Then
If _IntR(DllStructGetData($pTag, 3), $nByteOrder) = 3 Then
$t = _FileReadToStruct("short;short;short", $hFile, _IntR(DllStructGetData($pTag, 4), $nByteOrder))
_Add($sInfo, "ColorDepth", _IntR(DllStructGetData($t, 1), $nByteOrder) + _IntR(DllStructGetData($t, 2), $nByteOrder) + _IntR(DllStructGetData($t, 3), $nByteOrder))
$t = 0
Else
_Add($sInfo, "ColorDepth", _IntR(DllStructGetData($pTag, 4), $nByteOrder))
Endif
Endif
If $id = 0x0128 Then _AddSpecial($sInfo, $id, _ReadTag($hFile, $pTag, 0, $nByteOrder))
Next
Return($sInfo)
Endfunc
;===============================================================================
; EXIF Parser
;===============================================================================
Func ParseExif($hFile, $exif_offset)
Local $nTiffHdrOffset, $pHdr, $nIFDOffset, $pCnt, $nIFDCount, $pTag, $nCnt, $id, $nEIFDCount
Local $ByteOrder = 0, $sInfo = ""
Local $nEIFDOffset, $aTag[1][2]
Local $sSpecialTags = "0112,8822,9208,9207,9209,9101,0128,A217,A403,A402,A406,A408,A409,A40A"
_AddPair($aTag, 0x0100, "ExifWidth")
_AddPair($aTag, 0x0101, "ExifHeight")
_AddPair($aTag, 0x011A, "XResolution")
_AddPair($aTag, 0x011B, "YResolution")
_AddPair($aTag, 0x0102, "Colordepth")
_AddPair($aTag, 0x0132, "DateTime")
_AddPair($aTag, 0x9003, "DateTimeOriginal")
_AddPair($aTag, 0x9004, "DateTimeDigitized")
_AddPair($aTag, 0x9102, "CompressedBitsPerPixel")
_AddPair($aTag, 0x9000, "ExifVersion")
_AddPair($aTag, 0x9204, "ExposureBiasValue")
_AddPair($aTag, 0x829A, "ExposureTime")
_AddPair($aTag, 0x829D, "FNumber")
_AddPair($aTag, 0x920A, "FocalLength")
_AddPair($aTag, 0x8827, "ISO")
_AddPair($aTag, 0x010F, "Make")
_AddPair($aTag, 0x9202, "ApertureValue")
_AddPair($aTag, 0x9205, "MaxApertureValue")
_AddPair($aTag, 0x0110, "Model")
_AddPair($aTag, 0x0131, "Software")
_AddPair($aTag, 0x010E, "ImageDescription")
_AddPair($aTag, 0x013B, "Artist")
_AddPair($aTag, 0x8298, "Copyright")
_AddPair($aTag, 0xA420, "ImageUniqueID")
_AddPair($aTag, 0x9286, "UserComments")
_AddPair($aTag, 0x9201, "ShutterSpeedValue")
_AddPair($aTag, 0x9202, "ApertureValue")
_AddPair($aTag, 0x9203, "BrightnessValue")
_AddPair($aTag, 0x9206, "SubjectDistance")
_AddPair($aTag, 0xA404, "DigitalZoomRatio")
$nTiffHdrOffset = $exif_offset + 10 ; Start of TIFF header
$pHdr = _FileReadToStruct("short;short;dword", $hFile, $nTiffHdrOffset)
If DllStructGetData($pHdr, 1) = 0x4D4D then $ByteOrder = 1
$nIFDOffset = _IntR(DllStructGetData($pHdr, 3), $ByteOrder)
$pCnt = _FileReadToStruct("ushort", $hFile, $nTiffHdrOffset + $nIFDOffset) ; Tags count
$nIFDCount = _IntR(DllStructGetData($pCnt, 1), $ByteOrder)
$pTag = DllStructCreate("ushort;ushort;ulong;ulong")
For $nCnt = 0 To $nIFDCount - 1
$pTag = _FileReadToStruct($pTag, $hFile, $nTiffHdrOffset + $nIFDOffset + 2 + $nCnt * 12)
$id = DllStructGetData($pTag, 1)
$id = _IntR($id, $ByteOrder)
For $i = 1 To $aTag[0][0]
If $aTag[$i][0] = $id Then
_Add($sInfo, $aTag[$i]
1. Felesleges volt a teljes könyvtárat bemásolni, szétcseszi a fórumtopik kinézetét - elég lett volna belinkelni ( [link] ) - a moderátorokat kérem törölni a felesleges forráskód-részleteket (előre is köszönöm a többi fórumozó nevében is).
2. Az #include kulcsszó (nem parancs!) ugyanarra szolgál, mint más nyelvekben - például C/C++-ban a #include, Pascalnál a uses, Python-nál az import, C#-nál a using, Javanál az import - a forráskódot különböző állományokba (könyvtárakba) lehet vele szervezni, ezáltal áttekinthetőbb lesz a kód, moduláris, újrafelhasználható elemekkel (például függvénydeklarációkkal).
3. Az alsóvonás a függvények nevében egy, az Autoit telepítőjéhez mellékelt alapértelmezett függvénykönyvtáraknál (User Definied Functions - felhasználó által definiált függvényekre) alkalmazott "kódolási konvenció" (egyfajta nem kötelezően betartandó "stílusszabály", hogy hogyan "illik" az ilyen könyvtárakat írni).
Bővebben erről hol máshol, mint az Autoit leírásában:
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!