2013-02-26 08:37

[JSX] 串接圖片

由於工作上的需要將圖片分類串接成好幾組圖片,所以寫了一個 PhotoShop Scripting 來完成這件事。

圖片名稱是:
a001-01.jpg
a001-02.jpg
a002-01.jpg
a002-02.jpg
b001-01.jpg
b001-02.jpg
b001-03.jpg

而希望可以依 a001.jpg, a002.jpg, b001.jpg 分類串接在一起。

執行方式:
  1. 檔案 -> 指令碼 -> 瀏覽 -> 選擇 photo_join.jsx
  2. 在選擇多張要串接的圖片

  1. /** 圖片串接 for (PhotoShop Script) 
  2. *  author : Jax 
  3. *  email : weskerjax[at]gmail.com 
  4. *  website : http://jax-work-archive.blogspot.com/ 
  5. *  history : 2013.02.23 
  6. */ 
  7. // photo_join.jsx 
  8. //#target photoshop 
  9.  
  10.  
  11. /**水平邊界px*/ 
  12. var levMargin = 10; 
  13.  
  14. /**垂直邊界px*/ 
  15. var verMargin = 10; 
  16.  
  17. var WebJpegOptions = new ExportOptionsSaveForWeb() 
  18. WebJpegOptions.format = SaveDocumentType.JPEG; 
  19. WebJpegOptions.quality=80; 
  20.  
  21. function main(){ 
  22.    /*取得多個的檔案路徑*/ 
  23.    var fileList = File.openDialog( 
  24.        "開啟 JPG 檔案", 
  25.        "JPG Files:*.jpg", 
  26.        true 
  27.    ); 
  28.    if(fileList.length == 0){ alert("沒有任何檔案"); return; } 
  29.  
  30.    /*依檔名排序*/ 
  31.    fileList.sort(); 
  32.  
  33.    /*檔案依前綴分群*/ 
  34.    var groupList = {}; 
  35.    var filePath, i=0; 
  36.    while(filePath=fileList[i++]){ 
  37.        var prefix=filePath.name.match(/([a-z0-9]+)[-_].+\.jpg/i); 
  38.        if(!prefix || !prefix[1]){continue;} 
  39.        if(!groupList[prefix[1]]){ groupList[prefix[1]]=[]; } 
  40.        groupList[prefix[1]].push(filePath); 
  41.    } 
  42.  
  43.    /*依分群串接圖片*/ 
  44.    for(prefix in groupList){ 
  45.        photoJoin(prefix,groupList[prefix]); 
  46.    } 
  47. } 
  48.  
  49.  
  50. function copyArt(toArt, fromArt){ 
  51.    /*複製圖層*/ 
  52.    app.activeDocument=fromArt; 
  53.    fromArt.selection.selectAll() 
  54.    fromArt.selection.copy() 
  55.  
  56.    /*貼上圖層*/ 
  57.    app.activeDocument=toArt; 
  58.    return toArt.paste(); 
  59. } 
  60.  
  61.  
  62. function photoJoin(prefix, fileList){ 
  63.    /*新增目標圖片文件*/ 
  64.    var newPic = app.documents.add( 
  65.        1, 1, 72, 
  66.        prefix, 
  67.        NewDocumentMode.RGB, 
  68.        DocumentFill.TRANSPARENT 
  69.    ); 
  70.  
  71.    workSpace=fileList[0].parent.fsName.replace(/\\/ig,'/');; 
  72.  
  73.    var height=0; 
  74.    var width = newPic.width; 
  75.    var correspond = []; 
  76.  
  77.    /*複製所有圖檔至新建立的圖檔*/ 
  78.    for (var i=0; i<fileList.length; i++){ 
  79.        try { 
  80.            var atDoc=open(new File(fileList[i])); 
  81.        } catch (e) { continue; } 
  82.  
  83.        /*累計高度*/ 
  84.        height += atDoc.height.value + verMargin; 
  85.        /*最大寬度*/ 
  86.        width = Math.max(width,atDoc.width); 
  87.  
  88.        /*複製圖層*/ 
  89.        var layer = copyArt(newPic, atDoc); 
  90.        correspond.push({ 
  91.            'layer':layer, 
  92.            'height':atDoc.height.value 
  93.        }); 
  94.  
  95.        /*關閉檔案*/ 
  96.        atDoc.close(SaveOptions.DONOTSAVECHANGES); 
  97.    }; 
  98.  
  99.    app.activeDocument=newPic; 
  100.  
  101.    /*變更圖片大小*/ 
  102.    newPic.resizeCanvas( 
  103.        width+levMargin*2, 
  104.        height+verMargin, 
  105.        AnchorPosition.TOPLEFT 
  106.    ); 
  107.  
  108.    /*變更圖層定位*/ 
  109.    var top=verMargin; 
  110.    for (var i=0,l=correspond.length; i<l; i++){ 
  111.        if(correspond[i].layer===undefined){continue;} 
  112.  
  113.        correspond[i].layer.translate(levMargin, top); /*移動圖層*/ 
  114.        top += correspond[i].height+verMargin; /*定位累計*/ 
  115.    }; 
  116.  
  117.    /*匯出網頁JPEG*/ 
  118.    newPic.exportDocument( 
  119.        new File(File.encode(workSpace+"/"+prefix+".jpg")), 
  120.        ExportType.SAVEFORWEB, 
  121.        WebJpegOptions 
  122.    ); 
  123.  
  124.    /*關閉 newArt 文件*/ 
  125.    newPic.close(SaveOptions.DONOTSAVECHANGES); 
  126. } 
  127.  
  128. /*把Photoshop推到最上層*/ 
  129. app.bringToFront(); 
  130. /*設定使用的單位為「像素(Pixel)」*/ 
  131. app.preferences.rulerUnits = Units.PIXELS; 
  132. /*執行主程式*/ 
  133. main(); 
  134.  
  135. alert('成功執行!'); 

0 回應: