Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.
Keywords: ImgConvert Pixie compress files images save hard drive space
;================================================================================================== ; SQUASH-IMG.wbt v3.0 2009-07-24 (c)20090724.Joe Bybee, MCSE², MCP+I, CNA, A+ ;================================================================================================== ; ; SQUASH-IMG by Joe Bybee, MCSE December 2004, added command line option July 2009. ; ; Squash image was written to save hard drive space on servers because of newer cameras. ; ; ; I assume most digital cameras don't compress JPG images to reduce processing time ; ; allowing the camera to take more pictures faster. ; ; This program uses the Image Extender to open the JPG and then resave the JPG compressed. ; ; I usually see this program compress the files around 40 to 50% of original size, and retain ; ; the original image width, height, resolution, and bit depth. ; ; ; I have added a command line parameter feature for folders only. ; ; This way it can be scheduled to run on a server at night prior to a tape backup, to ; ; compress any additional pictures added that day. This is why I inlcuded the ; ; attribute Archive Flag feature, to skip images that have already been squashed. ; ; ; ; I also have an option to not change the original modified date of the image, so that ; ; users can see when the image was modified last and, not the date it was squashed. ; ; If squashing really old pictures, why give them new dates. ; ; ; Command Line Usage: See param 1 thru 5 below ; ; Example: Squash-Img "s:\public\pics" 1 1 1 "*.jpg" ; Example: Squash-Img "s:\public\pics" 1 0 1 "*.jpg;*.bmp" ; ; ============================================================================================= ; ;VER_NUM="1.0" ; 2004-02-01 Creation. ;VER_NUM="2.0" ; 2007-09-14 Added Archive Flag feature to only compress new files. ;VER_NUM="2.5" ; 2007-09-25 Added Retain Original Dates. Users complained they looked like new pictures. VER_NUM="3.0" ; 2009-07-24 Added command line option to run automatially with server scheduled events. ; ; CR = Num2Char(13) ;13 is a carriage-return LF = Num2Char(10) ;10 is a line feed ; CR_LF="%CR%%LF%%CR%%LF%" ; IntControl(49,3,0,0,0) ; add Min-Max-Close to Dialog Boxes ;IntControl(33,0,0,0,0) ; allows only 1 selection from Dialog Boxes ; CURR_DIR=DirGet() ; ; SKIP_DLG=0 ; ; if commmand line driven, skip dialog box ; If IsDefined(Param1) && IsDefined(Param2) && IsDefined(Param3) && IsDefined(Param4) && IsDefined(Param5) Then ; ; Display(10,"Launching SQUASH-IMG.exe",StrCat("Squash-Image Command Line Switches",CR_LF,"Path: ",PARAM1,CR_LF,"Sub-Folders: ",PARAM2,CR_LF,"Archive Flags: ",PARAM3,CR_LF,"Retain Dates: ",PARAM4,CR_LF,"File Types: ",PARAM5)) ; SKIP_DLG=1 ; FILE_OR_FOLDER = 2 ; must be folder option for command line ; ; IMG_FOLDER=param1 ; param1 = Folder Path (put in quotes to retain spaces) ; SUB_FOLDERS=param2 ; param2 = Recurse any sub-folders too ? 1 or 0 ; ARCHIVE_ONLY=param3 ; param3 = Process Archive Flags ONLY ? 1 or 0 ; ORG_DATE=param4 ; param4 = Retain Original Dates ? 1 or 0 ; FILE_TYPES=param5 ; param5 = Image Types *.JPG;*.BMP;*.GIF (semi-delimited) ; Goto SKIP_DLG EndIf ; ; ; ; ; ; =============================================================================== DLG BOX ; ; SQUASHFormat=`WWWDLGED,6.1` SQUASHCaption=`Squash Image v%VER_NUM% By: Joe Bybee, MCSE` SQUASHX=-1 SQUASHY=-1 SQUASHWidth=188 SQUASHHeight=183 SQUASHNumControls=013 SQUASHProcedure=`SQUASH` SQUASHFont=`DEFAULT` SQUASHTextColor=`DEFAULT` SQUASHBackground=`DEFAULT,DEFAULT` SQUASHConfig=0 SQUASH001=`041,003,110,020,STATICTEXT,DEFAULT,"SQUASH IMAGE",DEFAULT,100,DEFAULT,"Times New Roman|13824|1070|18","0|0|255",DEFAULT` SQUASH002=`009,025,166,052,GROUPBOX,DEFAULT,"CHOOSE FILE TYPE",DEFAULT,110,DEFAULT,"Arial|6656|70|34","0|0|0",DEFAULT` SQUASH003=`023,037,080,012,RADIOBUTTON,FILE_OR_FOLDER,"SINGLE FILE(s)",1,5,DEFAULT,"Arial|8192|70|34","255|0|255",DEFAULT` SQUASH004=`023,051,084,012,RADIOBUTTON,FILE_OR_FOLDER,"ENTIRE FOLDER",2,10,DEFAULT,"Arial|8192|70|34","255|0|255",DEFAULT` SQUASH005=`051,061,090,012,CHECKBOX,SUB_FOLDERS,"INCLUDE SUB-FOLDERS",1,15,2,"Arial|6656|70|34","255|0|0",DEFAULT` SQUASH006=`023,101,150,012,CHECKBOX,ORG_DATE,"Retain Original Modified Dates",1,25,DEFAULT,"Arial|6656|70|34","0|0|255",DEFAULT` SQUASH007=`023,083,120,012,CHECKBOX,ARCHIVE_ONLY,"Process ARCHIVE Flags ONLY",1,20,DEFAULT,"Arial|6656|70|34","0|0|255",DEFAULT` SQUASH008=`009,119,166,032,GROUPBOX,DEFAULT,"CHOOSE IMAGE FILTER",DEFAULT,120,DEFAULT,"Arial|6656|70|34","0|0|0",DEFAULT` SQUASH009=`023,133,056,012,CHECKBOX,TYPE_JPG,"JPG",1,30,0,"Arial|7680|70|34","255|0|255",DEFAULT` SQUASH010=`083,133,028,012,CHECKBOX,TYPE_BMP,"BMP",1,35,0,"Arial|7680|70|34","255|0|255",DEFAULT` SQUASH011=`141,133,028,012,CHECKBOX,TYPE_GIF,"GIF",1,40,0,"Arial|7680|70|34","255|0|255",DEFAULT` SQUASH012=`031,159,036,012,PUSHBUTTON,DEFAULT,"NEXT",1,45,32,DEFAULT,DEFAULT,DEFAULT` SQUASH013=`113,159,036,012,PUSHBUTTON,DEFAULT,"CANCEL",0,50,DEFAULT,DEFAULT,DEFAULT,DEFAULT` ; ;ButtonPushed=Dialog("SQUASH") ; ; TYPE_JPG=0 TYPE_BMP=0 TYPE_GIF=0 ; ; ; DLG_INIT = 0 DLG_TIMER = 1 DLG_PUSH = 2 DLG_RADIO = 3 DLG_CHECK = 4 DLG_EDIT = 5 DLG_LISTBOX = 6 DLG_ITEMBOX = 7 DLG_ITEMCHG = 8 DLG_DATECHG = 9 DLG_NUMCHG = 10 DLG_CLOSE = 11 ; requires Intcontrol(49,3,0,0,0) ; DLG_STATE_FOCUS = 1 DLG_STATE_QUERY = 2 DLG_STATE_ADD = 3 DLG_STATE_REMOVE = 4 DLG_STATE_GETFOCUS = 5 ; DLG_HIDE = 1 DLG_DISABLE = 2 DLG_HIDE_DISABLE = 3 DLG_LOCK = 8 DLG_MASK = 16 DLG_ENTER = 32 DLG_DIGITS = 64 DLG_FLATBUTTON = 128 ; DLG_SET_CHKBOX = 1 DLG_SET_RADIO = 2 DLG_SET_EDITBX = 3 DLG_SET_TITLE = 4 DLG_SET_NEWLIST = 5 DLG_SET_HIGHLIGHT = 6 DLG_SET_CALENDAR = 7 DLG_SET_SPIN = 8 DLG_SET_TABSTOP = 9 DLG_SET_SCROLL = 10 DLG_SET_BKCOLOR = 11 DLG_SET_NEWBMP = 12 DLG_SET_TXTCOLOR = 13 DLG_SET_ADDLIST = 14 DLG_SET_RMVLIST = 15 ; ; ; #DefineSubRoutine SQUASH (DLG_HANDLE, EVENT_CODE, DLG_ID, 0, 0) ; Switch (EVENT_CODE) ; ; ============================= ; Case DLG_INIT DialogProcOptions (DLG_HANDLE, DLG_TIMER, 0) ; 1000 = 1 second DialogProcOptions (DLG_HANDLE, DLG_PUSH, 1) ; 0 is off DialogProcOptions (DLG_HANDLE, DLG_RADIO, 1) ; 0 is off DialogProcOptions (DLG_HANDLE, DLG_CHECK, 0) ; 0 is off DialogProcOptions (DLG_HANDLE, DLG_EDIT, 0) ; 0 is off DialogProcOptions (DLG_HANDLE, DLG_LISTBOX, 0) ; 0 is off DialogProcOptions (DLG_HANDLE, DLG_ITEMBOX, 0) ; 0 is off DialogProcOptions (DLG_HANDLE, DLG_ITEMCHG, 0) ; 0 is off DialogProcOptions (DLG_HANDLE, DLG_DATECHG, 0) ; 0 is off DialogProcOptions (DLG_HANDLE, DLG_NUMCHG, 0) ; 0 is off DialogProcOptions (DLG_HANDLE, DLG_CLOSE, 0) ; 0 is off ; ;DialogControlSet(DLG_HANDLE, 005 DLG_SET_CHKBOX, 0) ; sets checkbox to unchecked 005 SUB FOLDERS DialogControlSet(DLG_HANDLE, 006, DLG_SET_CHKBOX, 1) ; sets checkbox to checked 006 ORG_DATE DialogControlSet(DLG_HANDLE, 007, DLG_SET_CHKBOX, 1) ; sets checkbox to checked 006 ARCHIVE ONLY DialogControlSet(DLG_HANDLE, 009, DLG_SET_CHKBOX, 1) ; sets checkbox to checked 009 TYPE_JPG DialogControlSet(DLG_HANDLE, 003, DLG_SET_RADIO, 1) ; sets RADIO to checked 003 TYPE_JPG ;DialogControlSet(DLG_HANDLE, 010, DLG_SET_CHKBOX, 0) ; sets checkbox to unchecked 010 TYPE_BMP ;DialogControlSet(DLG_HANDLE, 011, DLG_SET_CHKBOX, 0) ; sets checkbox to unchecked 011 TYPE_GIF ; ; Return(-1) ; ; ============================= ; ;case DLG_TIMER ; Return(-1) ; ; ============================= ; Case DLG_PUSH ; <-------- PUSH BUTTON ; ;Display(3,"DLG_PUSH","Inside DLG_PUSH") If DLG_ID==013 Then ; if CANCEL button Exit EndIf ; If DLG_ID==012 Then ; if SEND button ; ORG_DATE=DialogControlGet(DLG_HANDLE, 006, DLG_SET_CHKBOX) ; get value selected from 006 ORG_DATE ARCHIVE_ONLY=DialogControlGet(DLG_HANDLE, 007, DLG_SET_CHKBOX) ; get value selected from 007 ATTRIB_ONLY ; TYPE_JPG=DialogControlGet(DLG_HANDLE, 009, DLG_SET_CHKBOX) ; get value selected from 009 TYPE_JPG TYPE_BMP=DialogControlGet(DLG_HANDLE, 010, DLG_SET_CHKBOX) ; get value selected from 010 TYPE_BMP TYPE_GIF=DialogControlGet(DLG_HANDLE, 011, DLG_SET_CHKBOX) ; get value selected from 011 TYPE_GIF ; ;Display(5,"DLG_ID=001","Inside DLG_ID=001") ;Display(3,"JPG BMP & GIF",strcat(TYPE_JPG," ",TYPE_BMP," ",TYPE_GIF)) ; If TYPE_JPG==0 && TYPE_BMP==0 && TYPE_GIF==0 Then Display(3,"Error"," You must SELECT an IMAGE FILTER. ") EndIf ; If TYPE_JPG==1 || TYPE_BMP==1 || TYPE_GIF==1 Then Return(2) EndIf EndIf ; ; Return(-2) ; ; ============================= ; Case DLG_RADIO ; If DLG_ID==004 Then DialogControlState(DLG_HANDLE, 005, DLG_STATE_REMOVE, DLG_HIDE_DISABLE) ; 4=REMOVE disabled on Sub Folders Check Box EndIf ; If DLG_ID==003 Then DialogControlSet(DLG_HANDLE, 005, DLG_SET_CHKBOX, 0) ; sets checkbox to unchecked 005 SUB FOLDERS DialogControlState(DLG_HANDLE, 005, DLG_STATE_ADD, DLG_DISABLE) ; 3=ADD 1=invisible, 2=disabled, 3=both EndIf Return(-1) ; ; ============================= ; Case DLG_CHECK ; ;DialogControlState(DLG_HANDLE, 041, 4, 2) ; remove invisible style on Check Box ; Return(-1) ; ; ============================= ; ;case DLG_EDIT ; Return(-1) ; ; ============================= ; ;case DLG_LISTBOX ; ;Return(-1) ; ; ============================= ; ;case DLG_ITEMBOX ; ;if DLG_ID==004 then ; CONT_PICK=DialogControlGet(DLG_HANDLE, 004, 6) ; get value selected from 004. ;endif ; ;Return(-1) ; ; ============================= ; ;case DLG_ITEMCHG ; Display(2,"SELECTED",INI_SECT) ;iniReadPvt (section, keyname, default, filename) ; ;DialogControlState(DLG_HANDLE, 019, 3, 2) ; remove invisible style on Check Box ; ;Return(-1) ; ; ============================= ; ;case DLG_DATECHG ; Return(-1) ; ; ============================= ; ;case DLG_NUMCHG ; Return(-1) ; ; ============================= ; Case DLG_CLOSE Return(-1) ; EndSwitch ; EVENT_CODE ; Return(-1) ; #EndSubRoutine ; ; ==================================================================================================================== END FUNCTION ; ; ==================================================================================================================== END FUNCTION ; ; ButtonPushed=Dialog("SQUASH") ; FILE_TYPES="" ; If TYPE_JPG == 1 Then FILE_TYPES=StrCat(FILE_TYPES,"*.jpg;") FILE_FILTERS=StrCat(FILE_TYPES,"JPEG FILES|*.jpg|") EndIf ; If TYPE_GIF == 1 Then FILE_TYPES=StrCat(FILE_TYPES,"*.gif;") FILE_FILTERS=StrCat(FILE_TYPES,"GIF FILES|*.gif|") EndIf ; If TYPE_BMP == 1 Then FILE_TYPES=StrCat(FILE_TYPES,"*.bmp;") FILE_FILTERS=StrCat(FILE_TYPES,"BMP FILES|*.bmp|") EndIf ; ; ; ; :SKIP_DLG ; ; ; If StrSub(FILE_TYPES, StrLen(FILE_TYPES), 1) == ";" Then FILE_TYPES=StrSub(FILE_TYPES,1,StrLen(FILE_TYPES)-1) ; remove trailing delimeter EndIf ; ;Display(5,"FILE_TYPES",FILE_TYPES) ; SUCCESS_CT=0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ==============================================================================================; ; SINGLE FILE(S) ONLY ; ============================================================================================== ; ; ; AddExtender("WWIMG44I.DLL") ; If FILE_OR_FOLDER == 1 Then ; <------- Individual Files ; ; AskFileName(title, directory, filetypes, default filename, flag) 0=Save 1=Open 2=Open Multiple 3=Save no replace ; IMG_FOLDER=AskDirectory("SELECT or PASTE FOLDER PATH", "", "","",1|2|4|8) ; IMG_FILE=AskFilename("SELECT IMAGE(s) - hold CTRL to pick Multiples",IMG_FOLDER,FILE_FILTERS,"CTRL PICK IMAGES",2) ; ; ; IMG_CT=ItemCount(IMG_FILE,@TAB) ; If IMG_CT != 0 Then BoxOpen(" IMAGE CONVERT "," CONVERTING.... ") EndIf ; ; ; For LOOP_CT = 1 To IMG_CT ; CURR_IMG=ItemExtract(LOOP_CT,IMG_FILE,@TAB) ; IMG_DATE_MOD=FileTimeGetEx(CURR_IMG, 2) ; 1 file created 2 file last modified 3 file last accessed ; IMG_ATTRIBS=FileAttrGet(CURR_IMG) ; IS_ARCHIVE=0 ; If StrSub(IMG_ATTRIBS, 2, 1) == "A" Then IS_ARCHIVE=1 EndIf ; SQUASH_IT = 1 ; If ARCHIVE_ONLY==1 && IS_ARCHIVE == 1 Then SQUASH_IT = 1 EndIf ; ; If ARCHIVE_ONLY==1 && IS_ARCHIVE == 0 Then SQUASH_IT = 0 EndIf ; ; ; ; ; If SQUASH_IT == 1 Then ; ; BOX_TEXT=StrCat("Processing File(s): ",SUCCESS_CT+1,CR_LF,"Current Folder:%CR%%LF%",FilePath(CURR_IMG),CR_LF,"Current File:%CR%%LF%",FileBaseName(CURR_IMG,0)) ; BoxText(BOX_TEXT) ; ErrorMode(@OFF) IMG_SUCCESS=ImgConvert(CURR_IMG, CURR_IMG) ; <---- CONVERT ErrorMode(@CANCEL) ; ; ; If ORG_DATE == 1 Then ; FILES_THERE=FileExist(CURR_IMG) ; While FILES_THERE <> 1 TimeDelay(0.5) FILES_THERE=FileExist(CURR_IMG) EndWhile ; FileTimeSetEx(CURR_IMG, IMG_DATE_MOD, 2) ; 1 file created 2 file last modified 3 file last accessed ; EndIf ; If IMG_SUCCESS==0 Then ; IMG_ERROR=ItemExtract(ItemCount(CURR_IMG,"\"),CURR_IMG,"\") Display(10,"CONVERT ERROR",StrUpper(StrCat(" ", IMG_ERROR," MIGHT BE CORRUPT OR ANIMATED IMAGE. CONVERT FAILED. CONTINUING.... "))) ; SUCCESS_CT=SUCCESS_CT-1 EndIf ; SUCCESS_CT=SUCCESS_CT+1 EndIf ; if SQUASH_IT ; Next LOOP_CT ; BoxShut() DONE_TXT=StrCat(" SQUASHED ", SUCCESS_CT, " OF ", IMG_CT, " FILES SUCCESSFULLY. %CR%%LF%%CR%%LF%WinBatch, Gotta Love It !%CR%%LF%") ; Display(12," SQUASH IMAGE By: Joe Bybee, MCSE ",DONE_TXT) ; ; Exit EndIf ; if File ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ============================================================================================== ; ENTIRE FOLDER AND/OR SUB FOLDERS ; ============================================================================================== ; ; ; ; If FILE_OR_FOLDER == 2 Then ; <------- Entire Folder ; ; AskDirectory(prompt, browse-root, start-dir, confirm-prompt, flags) 1=EDIT BOX 2=DIR MISSING BOX 4=LARGER BOX 8=New Folder Button 16=Suppress Drive Errors ; If SKIP_DLG != 1 Then IMG_FOLDER=AskDirectory("SELECT or PASTE FOLDER PATH", "", "","",1|2|4|8) EndIf ; ; If SUB_FOLDERS==1 Then SRCH_FLAG=48 ; recurse sub-folders AND return directory names Else SRCH_FLAG=32 ; return directory names only EndIf ; ; SUCCESS_CT=0 ; AddExtender("wsrch34i.dll") ; IMG_CT=ItemCount(FILE_TYPES,";") ; ; TOTAL_FILES=0; ; For LOOP_CT = 1 To IMG_CT ; EXT_LOOP=ItemExtract(LOOP_CT,FILE_TYPES,";") ; I had a brain fart ; IMG_HANDLE=SrchInit(IMG_FOLDER, EXT_LOOP, "", "", SRCH_FLAG) ; BoxOpen("IMAGE FINDER",StrUpper("INITIALIZING %EXT_LOOP%")) ; TimeDelay(2) ; ; ================================================= while loop ; While 1 ; ; CURR_IMG=SrchNext(IMG_HANDLE) ; If CURR_IMG=="" && SUCCESS_CT==0 Then TOTAL_FILES=0 EndIf ; If CURR_IMG=="" Then Break ; If StrSub(CURR_IMG,StrLen(CURR_IMG),1) == "\" Then Continue ; eliminate Sub Folder Processing with \ on the end ; ; IMG_DATE_MOD=FileTimeGetEx(CURR_IMG, 2) ; 1 file created 2 file last modified 3 file last accessed ; IMG_ATTRIBS=FileAttrGet(CURR_IMG) ; TOTAL_FILES=TOTAL_FILES+1 ; IS_ARCHIVE=0 ; If StrSub(IMG_ATTRIBS, 2, 1) == "A" Then IS_ARCHIVE=1 EndIf ; SQUASH_IT = 1 ; If ARCHIVE_ONLY==1 && IS_ARCHIVE == 1 Then SQUASH_IT = 1 EndIf ; ; If ARCHIVE_ONLY==1 && IS_ARCHIVE == 0 Then SQUASH_IT = 0 EndIf ; ; If SQUASH_IT == 1 Then ; BOX_TEXT=StrCat("Processing File(s): ",SUCCESS_CT+1,CR_LF,"Current Folder:%CR%%LF%",FilePath(CURR_IMG),CR_LF,"Current File:%CR%%LF%",FileBaseName(CURR_IMG,0)) ; BoxText(BOX_TEXT) ; ErrorMode(@OFF) ; IMG_SUCCESS=ImgConvert(CURR_IMG,CURR_IMG) ; <-------- CONVERT ; ErrorMode(@CANCEL) ; ; ; If ORG_DATE == 1 Then ; FILES_THERE=FileExist(CURR_IMG) ; While FILES_THERE <> 1 ; TimeDelay(0.5) FILES_THERE=FileExist(CURR_IMG) EndWhile ; FileTimeSetEx(CURR_IMG, IMG_DATE_MOD, 2) ; 1 file created 2 file last modified 3 file last accessed ; EndIf ; If IMG_SUCCESS==0 Then ; IMG_ERROR=ItemExtract(ItemCount(CURR_IMG,"\"),CURR_IMG,"\") Display(10,"CONVERT ERROR",StrUpper(StrCat(" ", IMG_ERROR," MIGHT BE CORRUPT OR ANIMATED IMAGE. CONVERT FAILED. CONTINUING.... "))) ; SUCCESS_CT=SUCCESS_CT-1 EndIf ; SUCCESS_CT=SUCCESS_CT+1 ;TimeDelay(0.5) ; EndIf ; EndWhile ; ; ================================================= END while loop ; BoxShut() SrchFree(IMG_HANDLE) ; Next LOOP_CT ; DONE_TXT=StrCat(" SQUASHED ", SUCCESS_CT, " OF ", TOTAL_FILES, " FILES SUCCESSFULLY. %CR%%LF%%CR%%LF%WinBatch, Gotta Love It !%CR%%LF%") ; EndIf ; ; Display(10," SQUASH IMAGE By: Joe Bybee, MCSE ",DONE_TXT) ; ; TimeDelay(1) ; Exit
Article ID: W17634
Filename: Squash Images.txt
File Created: 2014:01:29:15:34:52
Last Updated: 2014:01:29:15:34:52