9 Replies Latest reply on Feb 18, 2018 9:30 AM by spathas

    Script to sub-divide an image into 4x6s.

    toddmaurer

      I like to make large images, like 20x30s and 30x40s.  Proofing these is expensive.  I'm looking for a script that would automatically take an image file and carve it into adjoining 4x6s that I can send through a printing service for the first proof.  A 30x40 print costs me $78 with shipping.  The 50 4x6s would only cost $10-20 dollars assuming I printed them all.

       

      So has anyone writen or know of a script of this nature?

        • 1. Re: Script to sub-divide an image into 4x6s.
          c.pfaffenbichler Level 9

          You could do a search for xbytor’s »TileMaker«-Script.

           

          But are You sure the prints would measure up to the more expensive proofs in color-consistency and -reliabilty?

          • 2. Re: Script to sub-divide an image into 4x6s.
            Paul Riggott Level 6

            Here is a script that will chop the active document into sections.

            #target photoshop
            function main(){
            var dlg=
            "dialog{text:'Script Interface',bounds:[100,100,380,260],"+
            "panel0:Panel{bounds:[10,10,270,150] , text:'' ,properties:{borderStyle:'etched',su1PanelCoordinates:true},"+
            "title:StaticText{bounds:[60,10,220,40] , text:'Chop-o-matic' ,properties:{scrolling:undefined,multiline:undefined}},"+
            "panel1:Panel{bounds:[10,40,250,100] , text:'' ,properties:{borderStyle:'etched',su1PanelCoordinates:true},"+
            "statictext1:StaticText{bounds:[10,10,111,30] , text:'Accross' ,properties:{scrolling:undefined,multiline:undefined}},"+
            "statictext2:StaticText{bounds:[140,10,230,27] , text:'Down' ,properties:{scrolling:undefined,multiline:undefined}},"+
            "across:DropDownList{bounds:[10,30,100,50]},"+
            "down:DropDownList{bounds:[140,30,230,50]}},"+
            "button0:Button{bounds:[10,110,110,130] , text:'Ok' },"+
            "button1:Button{bounds:[150,110,250,130] , text:'Cancel' }}};"
            var win = new Window(dlg,'Chop-o-matic');
            if(version.substr(0,version.indexOf('.'))>9){
            win.panel0.title.graphics.font = ScriptUI.newFont("Arial","BOLD",20);
            g = win.graphics;
            var myBrush = g.newBrush(g.BrushType.SOLID_COLOR, [1.00, 1.00, 1.00, 1]);
            g.backgroundColor = myBrush;
            var myPen =g.newPen (g.PenType.SOLID_COLOR, [1.00, 0.00, 0.00, 1],lineWidth=1);
            }
            win.center();
              for(var i=1;i<31;i++){
               win.panel0.panel1.across.add ('item', i);     
               win.panel0.panel1.down.add ('item', i);     
              }
            win.panel0.panel1.across.selection=0;
            win.panel0.panel1.down.selection=0;
            var done = false; 
                while (!done) { 
                  var x = win.show(); 
                  if (x == 0 || x == 2) {
                    win.canceled = true;
                    done = true; 
                  } else if (x == 1) { 
                    done = true; 
                    {
            if(!documents.length)return;
            var startRulerUnits = preferences.rulerUnits;
            preferences.rulerUnits = Units.PIXELS;
            doc = app.activeDocument;
            app.displayDialogs = DialogModes.NO;
            var tilesAcross = parseInt(win.panel0.panel1.across.selection.index)+1;
            var tilesDown =parseInt(win.panel0.panel1.down.selection.index)+1;
            var tileWidth = parseInt(doc.width/tilesAcross);
            var tileHeight = parseInt(doc.height/tilesDown);
            ProcessFiles(tilesDown,tilesAcross,tileWidth,tileHeight);
            app.preferences.rulerUnits = startRulerUnits;      
                  } 
               }
              }
            }
            main();
            function ProcessFiles(Down,Across,offsetX,offsetY){
             try{
            var newName = activeDocument.name.match(/(.*)\.[^\.]+$/)[1];
            }catch(e){var newName="UntitledChop"}
            TLX = 0; TLY = 0; TRX = offsetX; TRY = 0;
            BRX = offsetX; BRY = offsetY; BLX = 0; BLY = offsetY;
             for(var a = 0; a < Down; a++){
              for(var i = 0;i <Across; i++){
               app.activeDocument.duplicate (newName +"#"+a+"-"+i, true);
                activeDocument.selection.select([[TLX,TLY],[TRX,TRY],[BRX,BRY],[BLX,BLY]], SelectionType.REPLACE, 0, false); 
                executeAction( charIDToTypeID( "Crop" ), undefined, DialogModes.NO );
                app.activeDocument.selection.deselect();
                activeDocument = documents[0];
            TLX = offsetX * (i+1) ; TRX  = TLX + offsetX; BRX = TRX; BLX = TLX;  
                }
            TLX = 0; TLY = offsetY * (a +1); TRX = offsetX; TRY = offsetY * (a +1);
            BRX = offsetX; BRY = TRY + offsetY; BLX = 0; BLY = (offsetY * (a +1)+offsetY);
             
             }
            }
            
            1 person found this helpful
            • 3. Re: Script to sub-divide an image into 4x6s.
              toddmaurer Level 1

              I found the tile maker.  It's erroring out on my computer, Windows, CS2 combo.

               

              I do not expect the mass printed cheap 4x6s to come close to rivaling a well made 30x40 print, particularly in the color department.  What I do hope is that it will show me the limits of image quality blown up to such large size.  I want an inexpensive way to "proof" image sharpness and for the little things one only notices when the image is enlarged.

              • 4. Re: Script to sub-divide an image into 4x6s.
                toddmaurer Level 1

                Chop-o-matic script is sweet.  I believe that it is 90% of what I need.  Now I only need to figure out how to automate saving each of the windows to a unique file name.  I'll see if I can use the example to also ask for an output directorr, to save as high quality jegs to that directory, and close the window.  Thanks.

                • 5. Re: Script to sub-divide an image into 4x6s.
                  Paul Riggott Level 6

                  I have modified the script and added a checkbox, if ticked it will save and close each new section, save them as jpg with a quality of 12 into a folder off the active documents folder called Chop-O-Matic. If it's a new document that hasn't been saved the folder will be created on the desktop. On completion the new folder will be opened.

                  #target photoshop
                  function main(){
                  var dlg=
                  "dialog{text:'Script Interface',bounds:[100,100,380,290],"+
                  "panel0:Panel{bounds:[10,10,270,180] , text:'' ,properties:{borderStyle:'etched',su1PanelCoordinates:true},"+
                  "title:StaticText{bounds:[60,10,220,40] , text:'Chop-o-matic' ,properties:{scrolling:undefined,multiline:undefined}},"+
                  "panel1:Panel{bounds:[10,40,250,130] , text:'' ,properties:{borderStyle:'etched',su1PanelCoordinates:true},"+
                  "statictext1:StaticText{bounds:[10,10,111,30] , text:'Accross' ,properties:{scrolling:undefined,multiline:undefined}},"+
                  "statictext2:StaticText{bounds:[140,10,230,27] , text:'Down' ,properties:{scrolling:undefined,multiline:undefined}},"+
                  "across:DropDownList{bounds:[10,30,100,50]},"+
                  "down:DropDownList{bounds:[140,30,230,50]},"+
                  "saveFiles:Checkbox{bounds:[10,60,230,80] , text:'Save and Close new files?'}},"+
                  "button0:Button{bounds:[10,140,110,160] , text:'Ok' },"+
                  "button1:Button{bounds:[150,140,250,160] , text:'Cancel' }}};"
                  var win = new Window(dlg,'Chop-o-matic');
                  if(version.substr(0,version.indexOf('.'))>9){
                  win.panel0.title.graphics.font = ScriptUI.newFont("Arial","BOLD",20);
                  g = win.graphics;
                  var myBrush = g.newBrush(g.BrushType.SOLID_COLOR, [1.00, 1.00, 1.00, 1]);
                  g.backgroundColor = myBrush;
                  var myPen =g.newPen (g.PenType.SOLID_COLOR, [1.00, 0.00, 0.00, 1],lineWidth=1);
                  }
                  win.center();
                    for(var i=1;i<31;i++){
                     win.panel0.panel1.across.add ('item', i);     
                     win.panel0.panel1.down.add ('item', i);     
                    }
                  win.panel0.panel1.across.selection=0;
                  win.panel0.panel1.down.selection=0;
                  var done = false; 
                      while (!done) { 
                        var x = win.show(); 
                        if (x == 0 || x == 2) {
                          win.canceled = true;
                          done = true; 
                        } else if (x == 1) { 
                          done = true; 
                          {
                  if(!documents.length)return;
                  var startRulerUnits = preferences.rulerUnits;
                  preferences.rulerUnits = Units.PIXELS;
                  doc = app.activeDocument;
                  app.displayDialogs = DialogModes.NO;
                  var tilesAcross = parseInt(win.panel0.panel1.across.selection.index)+1;
                  var tilesDown =parseInt(win.panel0.panel1.down.selection.index)+1;
                  var tileWidth = parseInt(doc.width/tilesAcross);
                  var tileHeight = parseInt(doc.height/tilesDown);
                  var SaveFiles = win.panel0.panel1.saveFiles.value;
                  ProcessFiles(tilesDown,tilesAcross,tileWidth,tileHeight,SaveFiles);
                  app.preferences.rulerUnits = startRulerUnits;      
                        } 
                     }
                    }
                  }
                  main();
                  function ProcessFiles(Down,Across,offsetX,offsetY,SaveFiles){
                   try{
                  var newName = activeDocument.name.match(/(.*)\.[^\.]+$/)[1];
                  }catch(e){var newName="UntitledChop"}
                  var Path='';
                  try{
                  Path =  activeDocument.path;
                  }catch(e){Path = "~/Desktop";}
                   if(SaveFiles){
                  Path = Folder(decodeURI(Path) +"/Chop-O-Matic");
                  if(!Path.exists) Path.create();
                       }
                  TLX = 0; TLY = 0; TRX = offsetX; TRY = 0;
                  BRX = offsetX; BRY = offsetY; BLX = 0; BLY = offsetY;
                   for(var a = 0; a < Down; a++){
                    for(var i = 0;i <Across; i++){
                              var NewFileName = newName +"#"+a+"-"+i;
                     app.activeDocument.duplicate (NewFileName, true);
                      activeDocument.selection.select([[TLX,TLY],[TRX,TRY],[BRX,BRY],[BLX,BLY]], SelectionType.REPLACE, 0, false); 
                      executeAction( charIDToTypeID( "Crop" ), undefined, DialogModes.NO );
                      app.activeDocument.selection.deselect();
                   if(SaveFiles){
                  var saveFile = File(decodeURI(Path+"/"+NewFileName+".jpg"));
                  SaveJPEG(saveFile, 12);
                  app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
                  }
                      activeDocument = documents[0];
                  TLX = offsetX * (i+1) ; TRX  = TLX + offsetX; BRX = TRX; BLX = TLX;  
                      }
                  TLX = 0; TLY = offsetY * (a +1); TRX = offsetX; TRY = offsetY * (a +1);
                  BRX = offsetX; BRY = TRY + offsetY; BLX = 0; BLY = (offsetY * (a +1)+offsetY);
                   
                   }
                   if(SaveFiles){
                  Path.execute()
                      }
                  }
                  function SaveJPEG(saveFile, jpegQuality){
                  jpgSaveOptions = new JPEGSaveOptions();
                  jpgSaveOptions.embedColorProfile = true;
                  jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
                  jpgSaveOptions.matte = MatteType.NONE;
                  jpgSaveOptions.quality = jpegQuality;
                  activeDocument.saveAs(saveFile, jpgSaveOptions, true,Extension.LOWERCASE);
                  }
                  
                  • 6. Re: Script to sub-divide an image into 4x6s.
                    toddmaurer Level 1

                    This is super sweet.  Thanks Paul.

                    • 7. Re: Script to sub-divide an image into 4x6s.
                      spathas Level 1

                      Hi Paul,

                       

                      I am helping out a facebook group run a raffle online as well as in person.

                       

                      They have asked me to scan in their raffle books so they can email tickets to people who buy online and also sell physical tickets.

                       

                      The book is about 100 pages with 5 ticket per page. I think your script will be perfect for the job of doing all the slicing. I'm just wondering - will it work with Photoshop CC 2018?

                       

                      Thanks in advance for any advice. I'm away for work over the next week so won't have access to my personal computer so may not respond quickly.

                       

                      Cheers,

                      Con.

                      • 8. Re: Script to sub-divide an image into 4x6s.
                        c.pfaffenbichler Level 9

                        Paul Riggott has withdrawn from these Fora, maybe you should start a new thread.