2010年12月12日 星期日

Photoshop利用指令碼自動為圖片加框及EXIF說明

網路上其實可找到一些現成的指令碼,但是都不合用,只好自己稍微研究了一下,自己測試過在Canon或Fujifilm的數位相機拍的照片都可用,單眼的我沒試過,因為我只用過數位相機而已(其中取得EXIF的資訊我是利用Regular Expression來取,感覺效率較好)

將以下javascript存成.jsx放到C:\Program Files\Adobe\Adobe Photoshop CS5\Presets\Scripts



#target photoshop;
//將PS提到最上層
app.bringToFront();
//判斷是否有開啟圖檔  
    if(app.documents.length > 0){  
        //有開啟圖檔,設定doc為目前圖檔的參照(reference)  
        var AD = app.activeDocument;  
        //var AD = activeDocument.duplicate(); //建立副本
    }else{  
        //沒有開啟圖檔  
        alert("請開啟要調整大小的圖檔");  
        var file = app.openDialog()
        if (file[0]) {
            app.load(file[0]);
            var AD = app.activeDocument;  
        }
    }  

// 圖檔DPI 設定 (網頁用72,印刷300)
const IMAGE_DPI = 72;
// 邊框的比例(es. 1/100 = 1%)
const FRAME_THICKNESS = 1/100;
// exif說明文字字型
const TEXT_INFO_FONT = "Arial";
//exif說明文字大小
var rFontSize = 60;

//定義黑色
var black = new SolidColor();
black.rgb.red = black.rgb.green = black.rgb.blue = 0;
  
//定義白色
var white = new SolidColor();
white.rgb.red = white.rgb.green = white.rgb.blue = 255;
//yellow.rgb.red = 255, yellow.rgb.green = 255, yellow.rgb.blue = 255;


var photoWidth = AD.width.value; //圖片寬度
var photoHeight = AD.height.value; //圖片高度
var frameWidth = photoWidth*FRAME_THICKNESS;
var frameHeight = photoWidth*FRAME_THICKNESS;

//轉換圖檔成網頁用的解析度
var resRatio = AD.resolution/IMAGE_DPI;
if(resRatio != 1){
 AD.resizeImage(photoWidth,photoHeight,IMAGE_DPI,ResampleMethod.BICUBIC);
}


var exposureTime = ""; //快門
var fNumber = ""; //光圈
var ISOSpeedRatings = ""; //ISO
var dateTimeOriginal = ""; //相片拍攝時間
var cameraModel =""; //相機型號
var cameraMake =""; //相機廠牌

//RE的pattern
var re = /([A-Za-z0-9- ]*),([A-Za-z0-9:=\.\/ ]*),([0-9]*),/gi;
//取得exif相關資訊
ShowMatches(AD.info.exif + ",", re);

backgroundColor = black; //邊框線顏色
//AD.resizeCanvas(wFrame,hFrame, AnchorPosition.MIDDLECENTER);
  
//加入四邊邊框框底
AD.resizeCanvas(photoWidth + frameWidth,photoHeight + frameHeight, AnchorPosition.MIDDLECENTER); //可以修改參數獲得不同的邊框大小
  
//底部再加大點,便於寫字,可以修改參數獲得你需要的下邊框大小
var addHeight = rFontSize + (2/100*photoHeight);

AD.resizeCanvas(photoWidth + frameWidth,photoHeight + frameHeight+ addHeight,AnchorPosition.TOPCENTER);
/*
//The parameters are the name of the action, and then
//the action set they belong to
app.doAction('Foo Action','RyanKeeter');
*/

// 加入exif的內容
var description = cameraMake + " " + cameraModel + " ISO" + ISOSpeedRatings + " " + exposureTime + " " + fNumber + " " + dateTimeOriginal;
var nameLayer = AD.artLayers.add();
nameLayer.kind = LayerKind.TEXT;
var TI = nameLayer.textItem;
TI.justification = Justification.RIGHT
TI.position = [photoWidth,photoHeight+rFontSize+10]; //設定主題文字位置
TI.contents = description;
TI.font = TEXT_INFO_FONT; //字體類型
TI.size = rFontSize; //字體大小,點數
TI.color = white; //字體顏色,需預先定義
TI.fauxBold = true; //加粗

function ShowMatches(src, re) {
  var newLine = "\n";
  var result;
  var s = "";
 
  //Get the first match.
  result = re.exec(src);
 
  while (result != null) {

    //alert (RegExp.$1)
      if(RegExp.$1=="Make")       
        cameraMake = RegExp.$2;
       
      if(RegExp.$1=="Model")       
        cameraModel = RegExp.$2;
       
      if(RegExp.$1=="Date Time Original")       
        dateTimeOriginal = RegExp.$2;
       
      if(RegExp.$1=="Shutter Speed")       
        exposureTime = RegExp.$2;
       
      if(RegExp.$1=="ISO Speed Ratings")       
        ISOSpeedRatings = RegExp.$2;
       
      if(RegExp.$1=="F-Stop")       
        fNumber = RegExp.$2;

     //Get the next match.
     result = re.exec(src);
  }
 
}

4 則留言:

  1. hi 你好 我想要請問一個 javascript 的問題
    如果我有 17 * 24 個 小圖 想要組合成一個大圖
    檔名有按照 行列的 數字排序

    比如說 0-0.jpg ~ 0.16.jpg 是第一列
    1-0.jpg ~ 1-16.jpg 是第二列

    有可能在Photoshop裡 用Script 來達成
    自動組合的功能嗎 ??

    謝謝

    回覆刪除
  2. to VIO~VIO~~
    我是沒這樣用過
    不過我想理論上應該可以的
    你只要畫出17*24的選區
    然後在一一填上圖片即可
    選區的畫法可參考Photoshop CS5 JavaScript Ref.pdf
    裡面的Selection.jsx範例
    他會畫出棋盤格的選區喔

    回覆刪除
  3. 請問一下 一一填上 要怎麼弄?

    回覆刪除
  4. to VIO~VIO~~
    意思就是用迴圈,載入第一張圖檔,貼到第一個選區位置,然後再第二張,貼到第二個位置...依此類推囉
    你只要找到相對應的ps script,應該是可以作,只是我這塊也沒深入研究,你可能要自己看文件了,這我幫不上忙了
    當然如果你只是要弄縮圖目錄的話,不用那麻煩,PS本身就有縮圖目錄的功能啦

    回覆刪除