// レイヤー名で設定を変えて2値化 Version 2.1 //--------------------------2004.12.01 新瀬 進(http://www.os.rim.or.jp/~furu/) // 環境設定を変更============================================================= var strtRulerUnits = preferences.rulerUnits; // 単位をピクセルに設定 if(strtRulerUnits != Units.PIXELS){ preferences.rulerUnits = Units.PIXELS; } var strtHistory = preferences.numberOfHistoryStates; // ヒストリ保存数を設定 if(strtHistory < 13){ preferences.numberOfHistoryStates = 13; } var strtDisplayDialogs = displayDialogs; displayDialogs = DialogModes.NO; // BitmapConversionOptionsのプロパティを追加---------------------------------- BitmapConversionOptions.prototype.whiteTone = false; BitmapConversionOptions.prototype.shiftH = 0; BitmapConversionOptions.prototype.shiftV = 0; // 初期設定=================================================================== function initParam(){ var rPrm = new Array(); rPrm["toneSetName"] = "toneset.txt"; // トーン設定ファイル rPrm["tmpPath"] = "\\tmp\\"; rPrm["epsPath"] = "\\eps\\"; rPrm["fixMode"] = false; rPrm["Output"] = false; rPrm["tmpFile"] = false; rPrm["fileClose"] = false; rPrm["endBeep"] = false; rPrm["endAlert"] = false; return rPrm; } var endMessage = "2値化処理終了"; var White = new SolidColor(); // 白設定 White.gray.gray = 0; var Black = new SolidColor(); // 黒設定 Black.gray.gray = 100; // メイン===================================================================== if(documents.length == 0){ alert("処理対象の画像を開いてから実行してください"); }else{ var p = initParam(); var scrDefOpt = makeScrDefOption(); var docDefOpt = copyOption(scrDefOpt); var optSet = makeOptionSet(p); if(p["fixMode"]){ if(!confirm("FixModeが指定されています。よろしいですか?\nいいえを選択したすると開いているファイルのみを処理します。")){ p["fixMode"] = false; } } if(optSet){ BMC_main(); } else{ alert("トーン設定が読み込めませんでした"); } } // 環境設定を戻す============================================================= displayDialogs = strtDisplayDialogs; preferences.numberOfHistoryStates = strtHistory; preferences.rulerUnits = strtRulerUnits; // =========================================================================== // =========================================================================== // 本処理===================================================================== function BMC_main(){ if(p["tmpFile"] || p["Output"] || p["fixMode"]){ var basePath = activeDocument.path.fsName.toString(); } if(p["tmpFile"]){ // 中間ファイル用フォルダを準備 var tmpSavePath = basePath + p["tmpPath"]; var tmpFolderPath = new Folder( tmpSavePath ); if(!tmpFolderPath.exists){ tmpFolderPath.create(); } } if(p["Output"] || p["fixMode"]){ // 出力EPSファイル用フォルダを準備 var epsSavePath = basePath + p["epsPath"]; var epsFolderPath = new Folder( epsSavePath ); if(!epsFolderPath.exists){ epsFolderPath.create(); } } // --------------------------------------------------------------------------- var fileLoop, numberOfFiles, srcDoc, srcFile; if(p["fixMode"]){ var srcFolder = new Folder(basePath); // 対象フォルダ var srcFiles = srcFolder.getFiles("*.psd"); // 処理ファイルを取得 numberOfFiles = srcFiles.length; }else{ numberOfFiles = 1; } for(fileLoop=0; fileLoop 0){ for(loop=srcDoc.layerSets.length-1;loop>=0;loop--){ if(srcDoc.layerSets[loop].layers.length > 0 && srcDoc.layerSets[loop].visible){ preferences.numberOfHistoryStates++; srcDoc.layerSets[loop].merge(); } } } srcDoc.activeLayer.visible = layerVisible; // 最大解像度を調べる--------------------------------------------------------- var maxResolution = 0; for(loop=srcDoc.artLayers.length-1; loop>=0; loop--){ layerName = srcDoc.artLayers[loop].name; // レイヤー名 toneOpt = makeOption(layerName, docDefOpt); if(toneOpt.resolution > maxResolution){ maxResolution = toneOpt.resolution; // 最大解像度を設定 } } // 全レイヤーを非表示に------------------------------------------------------- var visibleOrg = invisibleAll(srcDoc); srcDoc.selection.deselect(); // 選択解除(ヒストリ位置設定のための処理) var before = srcDoc.activeHistoryState; // 元に戻すためのヒストリ保存 // 新規画像(2値化処理後保存用)作成----------------------------------------- srcDoc.flatten(); // 画像を統合 toneOpt = copyOption(docDefOpt); toneOpt.resolution = maxResolution; srcDoc.changeMode(ChangeMode.BITMAP, toneOpt); // 最大解像度で2値化 var maxWidth = srcDoc.width; var maxHeight = srcDoc.height; var newDoc = documents.add(maxWidth, maxHeight, maxResolution, "new", NewDocumentMode.GRAYSCALE); activeDocument = srcDoc; srcDoc.activeHistoryState = before; // 画像統合前に戻す // 各レイヤー毎に2値化------------------------------------------------------- for(loop=srcDoc.artLayers.length-1; loop>=0; loop--){ if(visibleOrg[loop]){ // 非表示レイヤーは飛ばす bgFlag = srcDoc.artLayers[loop].isBackgroundLayer; // 背景レイヤー判定 layerName = srcDoc.artLayers[loop].name; // レイヤー名 toneOpt = makeOption(layerName, docDefOpt); if(!bgFlag){ // 背景以外での処理 srcDoc.artLayers.add(); if(toneOpt.whiteTone){ // ホワイトトーン処理の場合背景は黒 srcDoc.selection.fill(Black, ColorBlendMode.NORMAL, 100, false); }else{ srcDoc.selection.fill(White, ColorBlendMode.NORMAL, 100, false); } srcDoc.activeLayer.moveAfter(srcDoc.artLayers[loop + 1]); } srcDoc.activeLayer = srcDoc.artLayers[loop]; srcDoc.activeLayer.visible = true; if(toneOpt.shiftH || toneOpt.shiftV){ // シフト処理 pxH = Cast(srcDoc.resolution * toneOpt.shiftH); pxV = Cast(srcDoc.resolution * toneOpt.shiftV); srcDoc.activeLayer.translate(-pxH, -pxV); } srcDoc.flatten(); // 画像を統合 if(toneOpt.method != BitmapConversionType.CUSTOMPATTERN){ srcDoc.changeMode(ChangeMode.BITMAP, toneOpt); // 2値化 }else{ changeCustom(toneOpt); // カスタムパターン回避用の2値化処理 } if(toneOpt.resolution != maxResolution){ srcDoc.resizeImage(maxWidth, maxHeight, maxResolution, ResampleMethod.NEARESTNEIGHBOR); // レイヤーの処理解像度が異なる場合は合わせる } srcDoc.activeLayer.copy(false); // 作成した画像をコピー activeDocument = newDoc; newDoc.paste(false); // ペースト if(bgFlag){ // 元が背景ならば統合 newDoc.flatten(); }else{ // それ以外はモードに合わせてレイヤーモードを変更 newDoc.activeLayer.name = layerName; if(toneOpt.whiteTone){ newDoc.activeLayer.blendMode = BlendMode.SCREEN; }else{ newDoc.activeLayer.blendMode = BlendMode.MULTIPLY; } if(toneOpt.shiftH || toneOpt.shiftV){ // アンシフト処理 pxH = Cast(newDoc.resolution * toneOpt.shiftH); pxV = Cast(newDoc.resolution * toneOpt.shiftV); newDoc.activeLayer.translate(pxH, pxV); } } activeDocument = srcDoc; srcDoc.activeHistoryState = before; // 2値化処理前の状態に戻す } } srcDoc.activeHistoryState = beforeAll; // 2値化画像保存------------------------------------------------------------- var saveName, newFile; activeDocument = newDoc; if(p["tmpFile"]){ // 統合前の中間ファイルを保存 var psdOpt = makePSDOption(); saveName = tmpSavePath + srcDoc.name.replace(/\.psd/i,""); newFile = new File( saveName ); newDoc.saveAs( newFile, psdOpt, false, Extension.LOWERCASE ); } if(p["Output"] || p["fixMode"]){ // 出力用EPSファイルを保存 var epsOpt = makeEPSOption(); newDoc.flatten(); toneOpt = copyOption(docDefOpt); toneOpt.method = BitmapConversionType.HALFTHRESHOLD; toneOpt.resolution = maxResolution; newDoc.changeMode(ChangeMode.BITMAP, toneOpt); saveName = epsSavePath + srcDoc.name.replace(/\.psd/i,""); newFile = new File( saveName ); newDoc.saveAs( newFile, epsOpt, false, Extension.LOWERCASE ); } if(p["fixMode"] || p["fileClose"]){ // 連続動作の場合はファイルを閉じる srcDoc.close(SaveOptions.DONOTSAVECHANGES); newDoc.close(SaveOptions.DONOTSAVECHANGES); } } // 2値化設定(フォールバックリソース)======================================= function makeScrDefOption(){ var scrDef = new BitmapConversionOptions(); scrDef.resolution = 1200; // 出力解像度 scrDef.angle = 45; // ハーフトーン角度 scrDef.frequency = 175; // ハーフトーン線数 scrDef.patternName = ""; // カスタムパターン名 scrDef.method = BitmapConversionType.HALFTONESCREEN; // 2値化方法 scrDef.shape = BitmapHalfToneType.ROUND; // ハーフトーン形状 // BitmapConversionType. 2値化方法 // CUSTOMPATTERN カスタムパターン // DIFFUSIONDITHER 誤差拡散法(ディザ) // HALFTHRESHOLD 50%を基準に2階調に分ける // HALFTONESCREEN ハーフトーン // PATTERNDITHER パターンディザ // BitmapHalfToneType. ハーフトーン形状 // CROSS クロス // DIAMOND 菱形 // ELLIPSE 楕円 // LINE ライン // ROUND 円 // SQUARE 四角 scrDef.whiteTone = false; scrDef.shiftH = 0; scrDef.shiftV = 0; return scrDef; } // EPSSaveOptions============================================================= function makeEPSOption(){ // ※EPSの保存オプションは印刷所の指定に合わせて変更してください var tmpOpt = new EPSSaveOptions(); // EPS保存オプション tmpOpt.embedColorProfile = false; tmpOpt.encoding = SaveEncoding.BINARY; tmpOpt.halftoneScreen = false; tmpOpt.interpolation = false; tmpOpt.preview = Preview.MONOCHROMETIFF; //tmpOpt.preview = Preview.MACMONOCHROME; // MACの場合 tmpOpt.psColorManagement = false; tmpOpt.transferFunction = false; tmpOpt.transparentWhites = false; tmpOpt.vectorData = false; return tmpOpt; } // PSDSaveOptions============================================================= function makePSDOption(){ var tmpOpt = new PhotoshopSaveOptions(); // PSD保存オプション tmpOpt.alphaChannels = false; tmpOpt.annotations = false; tmpOpt.embedColorProfile = false; tmpOpt.layers = true; tmpOpt.spotColors = false; return tmpOpt; } // CASTバグ対策=============================================================== function Cast(number){ return number + activeDocument.width - activeDocument.width; } // 2値化設定のコピー========================================================= function copyOption(srcOpt){ var newOpt = new BitmapConversionOptions(); // 設定をコピー newOpt.resolution = srcOpt.resolution; newOpt.angle = srcOpt.angle; newOpt.frequency = srcOpt.frequency; newOpt.patternName = srcOpt.patternName; newOpt.method = srcOpt.method; newOpt.shape = srcOpt.shape; newOpt.whiteTone = srcOpt.whiteTone; newOpt.shiftH = srcOpt.shiftH; newOpt.shiftV = srcOpt.shiftV; return newOpt; } // 文字化け修正=============================================================== function charTrans(charStr){ var ctFile = new File("name.tmp"); ctFile.open("w"); ctFile.encoding = "BINARY"; ctFile.writeln(unescape(charStr)); ctFile.close(); ctFile.open("r"); ctFile.encoding = "UTF-8"; var ctStr = ctFile.readln(); ctFile.close(); return ctStr; } // 全レイヤーを不可視に======================================================= function invisibleAll(docRef){ var loop; var visible = new Array(); //元の表示状態保存配列 for(loop=0; loop 1){ value = comStr[1]; } // 値 switch(comName.toLowerCase()){ // 新しいオプションを設定 case "r": case "reso": if(value){ newOpt.resolution = Number(value); } break; case "a": case "angl": if(value){ newOpt.angle = Number(value); } break; case "f": case "freq": if(value){ newOpt.frequency = Number(value); } break; case "p": case "ptrn": if(value){ newOpt.patternName = value; } break; case "m": case "meth": switch(value.toUpperCase()){ case "C": newOpt.method = BitmapConversionType.CUSTOMPATTERN; break; case "D": newOpt.method = BitmapConversionType.DIFFUSIONDITHER; break; case "2": newOpt.method = BitmapConversionType.HALFTHRESHOLD; break; case "H": newOpt.method = BitmapConversionType.HALFTONESCREEN; break; case "P": newOpt.method = BitmapConversionType.PATTERNDITHER; break; } break; case "s": case "shap": switch(value.toUpperCase()){ case "C": newOpt.shape = BitmapHalfToneType.CROSS; break; case "D": newOpt.shape = BitmapHalfToneType.DIAMOND; break; case "E": newOpt.shape = BitmapHalfToneType.ELLIPSE; break; case "L": newOpt.shape = BitmapHalfToneType.LINE; break; case "R": newOpt.shape = BitmapHalfToneType.ROUND; break; case "S": newOpt.shape = BitmapHalfToneType.SQUARE; break; } break; case "w": case "white": newOpt.whiteTone = true; break; case "h": case "hori": if(value){ newOpt.shiftH = Number(value); } break; case "v": case "vert": if(value){ newOpt.shiftV = Number(value); } break; default: if(optSet[comName]){ newOpt = copyOption(optSet[comName]); } break; } } return newOpt; } // トーン設定ファイル読み込み================================================= function makeOptionSet(rPrm){ var inputFile = new File(rPrm["toneSetName"]); if(!inputFile.exists){ return false; } var str,modeStr,setStr; var optSet = new Array(); var section = "DEFAULT"; inputFile.open("r"); while(true){ str = inputFile.readln(); str = str.replace(/;.+/, ""); // コメントを消去 str = str.replace(/ \t/g, ""); // 不要文字を消去 if(inputFile.eof){ break; } // ファイル読み込み終了 if(str == "" ){ continue; } // 空行は無視 if(str.match(/\[.+\]/)){ // セクション str = str.replace(/\[/, ""); str = str.replace(/\]/, ""); section = str; } switch(section.toUpperCase()){ // セクション動作 case "MODE": if(str.match(/.+=.+/i)){ modeStr = str.split('='); switch(modeStr[0]){ case "FixMode": if(modeStr[1] == "1"){ rPrm["fixMode"] = true; } break; case "Output": if(modeStr[1] == "1"){ rPrm["Output"] = true; } break; case "TmpFile": if(modeStr[1] == "1"){ rPrm["tmpFile"] = true; } break; case "FileClose": if(modeStr[1] == "1"){ rPrm["fileClose"] = true; } break; case "EndBeep": if(modeStr[1] == "1"){ rPrm["endBeep"] = true; } break; case "EndAlert": if(modeStr[1] == "1"){ rPrm["endAlert"] = true; } break; } } break; case "TONE": if(str.match(/def\(.+\)/i)){ // デフォルト設定 str = str.replace(/def\(/i, ""); str = str.replace(/\)/, ""); docDefOpt = makeOption(str, scrDefOpt); } if(str.match(/set".+"\(.+\)/i)){ // 設定セット setStr = str.split('"'); setStr[2] = setStr[2].replace(/\(/, ""); setStr[2] = setStr[2].replace(/\)/, ""); optSet[setStr[1]] = makeOption(setStr[2], docDefOpt); } break; } } inputFile.close(); return optSet; }