#Region ;**** Directives created by AutoIt3Wrapper_GUI **** ;#AutoIt3Wrapper_Res_Description=bbb;檔案描述 ;#AutoIt3Wrapper_Res_Fileversion=1.0.0.0;檔案版本 ;#AutoIt3Wrapper_Res_LegalCopyright=ccccopy;著作權 ;#AutoIt3Wrapper_Res_Field=ProductName|ddd;產品名稱 ;#AutoIt3Wrapper_Res_ProductVersion=1.0.0.3;產品版本 #AutoIt3Wrapper_Res_requestedExecutionLevel=highestAvailable;請求可用最高權限 #RequireAdmin #pragma compile(UPX, true) ;#AutoIt3Wrapper_Change2CUI=y ;讓consolewrite 可以輸出到cmd ;#pragma compile(FileVersion, 1.0.0.0) #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include ; DPI #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include _GDIPlus_Startup() If $CmdLine[0] <> 0 Then ;測試時可以改 <> 吃參數 ,不吃command line Else $apppaaa = StringSplit('/setting@output=C:\Users\konya\Downloads\Coding\windows_autoit\AU3\多頁TIF取出圖檔_多張圖檔轉為多頁TIF\idc.tif|mode=multitif', "@", 2) ;2是不要計數 ;$apppaaa = StringSplit($CmdLine[1], "@", 2) ;2是不要計數 ;_ArrayDisplay($apppaaa) Switch $apppaaa[0] Case "/setting" ;msgbox(0,"",$apppaaa[1]) $oDict = arraytypetosqltype($apppaaa[1]) ;"/setting@input=C:\Users\konya\Desktop\12.jpg|mode=merge or split|name=test" main($oDict) EndSwitch EndIf ;image_tool.exe "/setting@input=C:\Users\konya\Downloads\Coding\windows_autoit\AU3\多頁TIF取出圖檔_多張圖檔轉為多頁TIF\1.tif|mode=split|name=test" ;image_tool.exe "/setting@input=C:\Users\konya\Downloads\Coding\windows_autoit\AU3\多頁TIF取出圖檔_多張圖檔轉為多頁TIF\1.tif|mode=merge|name=test" ;image_tool.exe "/setting@output=C:\Users\konya\Downloads\Coding\windows_autoit\AU3\多頁TIF取出圖檔_多張圖檔轉為多頁TIF\t.tif|mode=multitif" func main($oDict) Global $aBitmaps = _GDIPlus_ImageLoadFromMultiPageImage($oDict.Item("input")) ;_ArrayDisplay($aBitmaps) ;圖片的清單跟指標 Switch $oDict.Item("mode") Case "merge" _mergeallframe($aBitmaps) ;把所有找到的圖合成一張大圖左到右排列 Case "split" _splitallframe($aBitmaps) ;把所有找到的圖分割成多個檔案 Case "multitif" _createmultitif($oDict.Item("output")) ;把多張圖變成multitif EndSwitch EndFunc Func _createmultitif($sFile, $iPages = 4) local $aFilter2 Global Const $sFolder = FileSelectFolder("Select a folder with images", "") If @error Then Exit MsgBox($MB_ICONERROR, "Error", "No folder was selected!", 10) Global $aFilter = _FileListToArrayRec($sFolder, "*.jpg;*.png;*.bmp;*.tif", $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH) ;_ArrayDisplay($aFilter) If @error Then Exit MsgBox($MB_ICONERROR, "Error", "No images were found in selected folder!", 10) Local $sImgCLSID = _GDIPlus_EncodersGetCLSID("tif") ;create CLSID for a TIFF image file type ;Create main image Local $hImage = _GDIPlus_BitmapCreateFromFile($aFilter[1]) ;Local $hImage = _GDIPlus_BitmapCreateFromScan0(400, 300) ;Local $hContext = _GDIPlus_ImageGetGraphicsContext($hImage) ;_GDIPlus_GraphicsClear($hContext, 0xFFFFFFFF) ;_GDIPlus_GraphicsDrawRect($hContext, 5, 5, 390, 290) ;_GDIPlus_GraphicsDrawString($hContext, "MultiFrame TIFF" & @CRLF & "Frame " & 1 & "/" & $iPages, 20, 20, "ARIAL", 32) ;_GDIPlus_GraphicsDispose($hContext) ;Save main image (first frame) and add MultiFrame-Param local $sParamData = "int data;int colordepth;int compression" Local $tParamData = DllStructCreate($sParamData) ;DllStructSetData 方式一 $tParamData.data = $GDIP_EVTMULTIFRAME $tParamData.colordepth = 4 ;2, 4, 8, 16, 24, 32 $tParamData.compression = $GDIP_EVTCOMPRESSIONCCITT3 ;$GDIP_EVTCOMPRESSIONCCITT3; $GDIP_EVTCOMPRESSIONCCITT4 ;$GDIP_EVTCOMPRESSIONRLE; $GDIP_EVTCOMPRESSIONLZW ;$GDIP_EVTCOMPRESSIONNONE ;_WinAPI_DisplayStruct($tParamData);顥示dllstruct 列出dllStruct Local $tParams = _GDIPlus_ParamInit(3) _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tParamData, "Data")) _GDIPlus_ParamAdd($tParams, $GDIP_EPGCOLORDEPTH, 1, $GDIP_EPTLONG, DllStructGetPtr($tParamData, "ColorDepth")) _GDIPlus_ParamAdd($tParams, $GDIP_EPGCOMPRESSION, 1, $GDIP_EPTLONG, DllStructGetPtr($tParamData, "Compression")) _GDIPlus_ImageSaveToFileEx($hImage, $sFile, $sImgCLSID, $tParams) ;DllStructSetData 方式二 DllStructSetData($tParamData, "Data", $GDIP_EVTFRAMEDIMENSIONPAGE) DllStructSetData($tParamData, "ColorDepth", 4) ;2, 4, 8, 16, 24, 32 DllStructSetData($tParamData, "Compression", $GDIP_EVTCOMPRESSIONCCITT3) $tParams = _GDIPlus_ParamInit(3) _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tParamData, "Data")) _GDIPlus_ParamAdd($tParams, $GDIP_EPGCOLORDEPTH, 1, $GDIP_EPTLONG, DllStructGetPtr($tParamData, "ColorDepth")) _GDIPlus_ParamAdd($tParams, $GDIP_EPGCOMPRESSION, 1, $GDIP_EPTLONG, DllStructGetPtr($tParamData, "Compression")) ;Create & save next frames Local $hImage_SubPage For $i = 2 To $aFilter[0] $hImage_SubPage = _GDIPlus_BitmapCreateFromFile($aFilter[$i]) ;$hImage_SubPage = _GDIPlus_BitmapCreateFromScan0(400, 300) ;$hContext = _GDIPlus_ImageGetGraphicsContext($hImage_SubPage) ;_GDIPlus_GraphicsClear($hContext, 0xFFFFFFFF) ;_GDIPlus_GraphicsDrawRect($hContext, 5, 5, 390, 290) ;_GDIPlus_GraphicsDrawString($hContext, "MultiFrame TIFF" & @CRLF & "Frame " & $i & "/" & $iPages, 20, 20, "ARIAL", 32) ;_GDIPlus_GraphicsDispose($hContext) ;add frame to file _GDIPlus_ImageSaveAddImage($hImage, $hImage_SubPage, $tParams) ;dispose curent frame bitmap _GDIPlus_BitmapDispose($hImage_SubPage) Next ;Close the multiframe file. $tParamData.data = $GDIP_EVTFLUSH $tParams = _GDIPlus_ParamInit(1) _GDIPlus_ParamAdd($tParams, $GDIP_EPGSAVEFLAG, 1, $GDIP_EPTLONG, DllStructGetPtr($tParamData, "Data")) _GDIPlus_ImageSaveAdd($hImage, $tParams) _GDIPlus_ImageDispose($hImage) _GDIPlus_Shutdown() EndFunc Func _splitallframe($aBitmaps) Global $i, $iW = 0, $iH = 0, $iX = 0 For $i = 1 to $aBitmaps[0] $iW = _GDIPlus_ImageGetWidth($aBitmaps[$i]) $iH = _GDIPlus_ImageGetHeight($aBitmaps[$i]) $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap) _GDIPlus_GraphicsDrawImageRect($hGfx, $aBitmaps[$i], 0, 0, _GDIPlus_ImageGetWidth($aBitmaps[$i]), _GDIPlus_ImageGetHeight($aBitmaps[$i])) $sSave = @ScriptDir &"\" & $oDict.Item("name") & "(" & $i & ").jpg" _GDIPlus_ImageRotateFlip($hBitmap, 0) #cs Type of rotation and flip: 0 - No rotation and no flipping (A 180-degree rotation, a horizontal flip and then a vertical flip) 1 - A 90-degree rotation without flipping (A 270-degree rotation, a horizontal flip and then a vertical flip) 2 - A 180-degree rotation without flipping (No rotation, a horizontal flip followed by a vertical flip) 3 - A 270-degree rotation without flipping (A 90-degree rotation, a horizontal flip and then a vertical flip) 4 - No rotation and a horizontal flip (A 180-degree rotation followed by a vertical flip) 5 - A 90-degree rotation followed by a horizontal flip (A 270-degree rotation followed by a vertical flip) 6 - A 180-degree rotation followed by a horizontal flip (No rotation and a vertical flip) 7 - A 270-degree rotation followed by a horizontal flip (A 90-degree rotation followed by a vertical flip) #CE _GDIPlus_ImageSaveToFile($hBitmap, $sSave) _GDIPlus_GraphicsDispose($hGfx) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_BitmapDispose($aBitmaps[$i]) Next _GDIPlus_Shutdown() EndFunc Func _mergeallframe($aBitmaps) Global $i, $iW = 0, $iH = 0, $iX = 0 For $i = 1 to $aBitmaps[0] $iW += _GDIPlus_ImageGetWidth($aBitmaps[$i]) $iH = _GDIPlus_ImageGetHeight($aBitmaps[$i]) > $iH ? _GDIPlus_ImageGetHeight($aBitmaps[$i]) : $iH ; 現在的值比變數$iH 大的話把目前的變數值放進$iH ;local $iH2 = 0 ;$iH2 = 3 > 3 ? 6 : $iH2 ;msgbox(0,"",$iH2 ) Next $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH) $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap) $iW = 0 For $i = 1 To $aBitmaps[0] ;控制左到右還右到左的併貼順序,最後一張就是UI看到的第一張 _GDIPlus_GraphicsDrawImageRect($hGfx, $aBitmaps[$i], $iW, 0, _GDIPlus_ImageGetWidth($aBitmaps[$i]), _GDIPlus_ImageGetHeight($aBitmaps[$i])) $iW += _GDIPlus_ImageGetWidth($aBitmaps[$i]) Next $sSave = @ScriptDir & "\" & $oDict.Item("name") &".jpg" _GDIPlus_ImageRotateFlip($hBitmap, 0) #cs Type of rotation and flip: 0 - No rotation and no flipping (A 180-degree rotation, a horizontal flip and then a vertical flip) 1 - A 90-degree rotation without flipping (A 270-degree rotation, a horizontal flip and then a vertical flip) 2 - A 180-degree rotation without flipping (No rotation, a horizontal flip followed by a vertical flip) 3 - A 270-degree rotation without flipping (A 90-degree rotation, a horizontal flip and then a vertical flip) 4 - No rotation and a horizontal flip (A 180-degree rotation followed by a vertical flip) 5 - A 90-degree rotation followed by a horizontal flip (A 270-degree rotation followed by a vertical flip) 6 - A 180-degree rotation followed by a horizontal flip (No rotation and a vertical flip) 7 - A 270-degree rotation followed by a horizontal flip (A 90-degree rotation followed by a vertical flip) #CE _GDIPlus_ImageSaveToFile($hBitmap, $sSave) _GDIPlus_GraphicsDispose($hGfx) _GDIPlus_BitmapDispose($hBitmap) For $i = 1 to $aBitmaps[0] _GDIPlus_BitmapDispose($aBitmaps[$i]) Next _GDIPlus_Shutdown() ShellExecute($sSave) EndFunc ;code by Eukalyptus Func _GDIPlus_ImageLoadFromMultiPageImage($sPath) Local $hImage = _GDIPlus_ImageLoadFromFile($sPath) If @error Then Return SetError(1, 1, False) Local $iCount = _GDIPlus_ImageGetFrameDimensionsCount($hImage) If Not $iCount Then Return SetError(1, 2, False) Local $aList = _GDIPlus_ImageGetFrameDimensionsList($hImage) ;_ArrayDisplay($aList) If @error Or Not IsArray($aList) Then Return SetError(1, 3, False) Local $iPixelFormat, $iImageW, $iImageH Local $aReturn[1], $iCnt = 0 For $i = 1 To $aList[0] $iCount = _GDIPlus_ImageGetFrameCount($hImage, $aList[$i]) ReDim $aReturn[$iCount+1] $aReturn[0] = $iCount ;_ArrayDisplay($aReturn) For $j = 1 To $iCount If $j = $iCount Then _GDIPlus_ImageSelectActiveFrame($hImage, $aList[$i], $j) $iCnt = 1 $iPixelFormat = _GDIPlus_ImageGetPixelFormat($hImage) ;_ArrayDisplay($iPixelFormat) $iImageW = _GDIPlus_ImageGetWidth($hImage) $iImageH = _GDIPlus_ImageGetHeight($hImage) $aReturn[$iCnt] = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iImageW, $iImageH, $iPixelFormat) ;_ArrayDisplay($aReturn) EndIf If $j < $iCount Then _GDIPlus_ImageSelectActiveFrame($hImage, $aList[$i], $j) $iCnt = $j + 1 $iPixelFormat = _GDIPlus_ImageGetPixelFormat($hImage) ;_ArrayDisplay($iPixelFormat) $iImageW = _GDIPlus_ImageGetWidth($hImage) $iImageH = _GDIPlus_ImageGetHeight($hImage) $aReturn[$iCnt] = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iImageW, $iImageH, $iPixelFormat) ;_ArrayDisplay($aReturn) EndIf Next Next _GDIPlus_ImageDispose($hImage) ;_ArrayDisplay($aReturn) Return $aReturn EndFunc ;==>_GDIPlus_ImageLoadFromMultiPageImage Func _GDIPlus_ImageGetFrameDimensionsCount($hImage) Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsCount", "handle", $hImage, "uint*", 0) If @error Then Return SetError(@error, @extended, -1) If $aResult[0] Then Return SetError(10, $aResult[0], False) ;_ArrayDisplay($aResult) Return $aResult[2] EndFunc ;==>_GDIPlus_ImageGetFrameDimensionsCount Func _GDIPlus_ImageGetFrameDimensionsList($hImage) Local $iI, $iCount, $tBuffer, $pBuffer, $aPropertyIDs[1], $aResult $iCount = _GDIPlus_ImageGetFrameDimensionsCount($hImage) If @error Then Return SetError(@error, @extended, -1) $tBuffer = DllStructCreate("byte[" & $iCount * 16 & "]") $pBuffer = DllStructGetPtr($tBuffer) ;msgbox(0,"",$pBuffer) $aResult = DllCall($__g_hGDIPDll, "int", "GdipImageGetFrameDimensionsList", "handle", $hImage, "ptr", $pBuffer, "int", $iCount) ;_ArrayDisplay($aResult) If @error Then Return SetError(@error, @extended, -1) If $aResult[0] Then Return SetError(10, $aResult[0], False) ReDim $aPropertyIDs[$iCount + 1] $aPropertyIDs[0] = $iCount ;_ArrayDisplay($aPropertyIDs) For $iI = 1 To $iCount $aPropertyIDs[$iI] = _WinAPI_StringFromGUID($pBuffer) ;pbuffer 轉 字串的GUID ;_ArrayDisplay($aPropertyIDs) $pBuffer += 16 ;msgbox(0,"",$pBuffer) Next Return $aPropertyIDs EndFunc ;==>_GDIPlus_ImageGetFrameDimensionsList Func arraytypetosqltype($inputparameter) $oDict = ObjCreate("Scripting.Dictionary") If $inputparameter <> "" Then $inputparameter = StringSplit($inputparameter, "|") ;_ArrayDisplay($inputparameter) For $i = 1 To $inputparameter[0] Local $arrayaddinput = StringSplit($inputparameter[$i], "=") $oDict.Add($arrayaddinput[1], $arrayaddinput[2]) ; Add 是加, Exists("item") 是看有沒有存在 , Item是取KEY ,Key是取Item ,Remove 刪除 ,Count 總計 ,RemoveAll 刪全部 ,Items 是陣列 Next EndIf If $oDict.exists("item") = False Then $oDict.Add("item", 1) EndIf Return $oDict EndFunc ;==>arraytypetosqltype