PhotoshopCCには塗りつぶしパターンに、
スクリプトが使えるようになった。
レンガのスクリプトがあったのだけど
ランダムの回転が無かったので足してみた。
本当はタイルパターンに対応させてみたかったのだけど、
色の変化は、ランダムに付けられるので、ちょっと見送り。
感触としては悪くないかも
ソース
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Here are a few parameters that you can change to modify the behavior of the patterm // Feel free to modify the values, don't change the variable names modelParameters = { // scaling of the input pattern patternScale : 1, // Offset between rows of pattern expressed in percent of pattern width. // For example 50% is half the width. offset : 50, // use a value between 0 and 100. The default is 50. // Spacing between patterns in pixels. // For example,1 creates 1 pixel gap between patterns spacing : 0, // use a value between -10 to 20. The default is 0. // Variation of color of the pattern. // For example, value of 0.2 means that each of the red, green, and blue color components // will be multiplied by a DIFFERENT random value from interval 0.8 and 1.2. // Set to 0 if you do not want to modify the pattern color. colorRandomness : 0.05, // use a value between 0 and 1. The default is 0.05. // Variation of pattern brightness. // For example, value of 0.6 means that each of the red, green, and blue color components // will be multiplied by THE SAME random value from interval 0.4 and 1.6. // Set to 0 if you do not want to modify the pattern brightness. brightnessRandomness : 0.1, // use a value between 0 and 1. The default is 0.1. // Rotation of individual patterns. rotateAngle : 0, // Use a value between -180 and 180. The default is 0. //Rotate Randmaize rotateAngleRandomness : 0 } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // You can modify the code below but keep in mind that as with any scripting // you can break things. Keep a backup copy. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Get pattern and its size var pattern = RenderAPI.getParameter(kpsPattern) var patternSize = pattern.getParameter(kpsSize) var patternSizeForDialog = Math.max (patternSize.x, patternSize.y) function run (api, parameters, scale) { // get the size of the output area var outputSize = api.getParameter(kpsSize) // get the location of the top left corner of the bounding rectangle around the selected area var outputOrigin = api.getParameter(kpsOrigin) var patternSize = pattern.getParameter(kpsSize) patternSize *= parameters.patternScale // to finetune the progress bar, specify how many pixels are covered by patterns - the bigger the spacing the lower the value, for example api.setParameter(kpsPixelCoverage, 0.5 * (patternSize.x * patternSize.y) / ((patternSize.x + parameters.spacing) * (patternSize.y + parameters.spacing ) ) ) // compute the pattern size in x and y after rotation var rotSizeX = patternSize.x * Math.abs( Math.cos(parameters.rotateAngle / 180.0 * Math.PI)) + patternSize.y * Math.abs( Math.sin(parameters.rotateAngle / 180.0 * Math.PI)) var rotSizeY = patternSize.x * Math.abs( Math.sin(parameters.rotateAngle / 180.0 * Math.PI)) + patternSize.y * Math.abs( Math.cos(parameters.rotateAngle / 180.0 * Math.PI)) // possibly add spacing if (patternSize.x + parameters.spacing >= Math.min (5, patternSize.x) ) patternSize.x += parameters.spacing else patternSize.x = Math.min (5, patternSize.x) if (patternSize.y + parameters.spacing >= Math.min (5, patternSize.y)) patternSize.y += parameters.spacing else patternSize.y = Math.min (5, patternSize.y) // scale up if the patternsize is 1 to avoid long loop if (patternSize.x == 1 && patternSize.y == 1) { if (scale == 1) scale = 20 } patternSize *= scale //patternSize *= 2 api.translateRel (patternSize.x/2, patternSize.y/2) // negative origin may happen for preview of very small documents if (outputOrigin.x < 0) outputOrigin.x = 0 if (outputOrigin.y < 0) outputOrigin.y = 0 api.translateRel ( -(outputOrigin.x % patternSize.x), -(outputOrigin.y % patternSize.y)) var row = Math.floor( outputOrigin.y / patternSize.y ) var column = Math.floor( outputOrigin.x / patternSize.x ) var extraRows = 0 // on each side, if needed var extraColumns = 0 if (parameters.rotateAngle != 0 || parameters.spacing < 0) { // start a few rows or columns earlier because the tips of rotated patterns may show up in the selection // or because the spacing is negative and transparent patterns to the left would still show up extraRows = Math.floor (rotSizeY / (2 * patternSize.y) + 0.4999) extraColumns = Math.floor (rotSizeX / (2 * patternSize.x) + 0.4999) row -= extraRows; column -= extraColumns; api.translateRel ( -patternSize.x * extraColumns, -patternSize.y * extraRows) } pattern.setParameter (kpsColorBlendMode, kpsBlendMultiply) //pattern.setParameter (kpsColorBlendMode, kpsBlendLinearLight) //Add Trea patern BlendMode //RenderAPI.setParameter(kpsUseOpenGL, 0) //pattern.setParameter(kpsPatternBlendMode,kpsBlendLighterColor) //pattern.setParameter(kpsPatternBlendMode,kpsBlendDarkerColor) //var margin_y = Math.max(patternSize.y, -parameters.spacing) var margin_y = patternSize.y + 2 * extraRows * patternSize.y for (var y = 0; y < outputSize.y + margin_y; y+= patternSize.y, row++) { api.pushMatrix() var x = 0 //if ( (row%2) == 1) { var shift = parameters.offset*0.01 * row api.translateRel( ((shift - Math.floor(shift)) - 1)* patternSize.x, 0) x = - patternSize.x // one extra, just in case } //var margin_x = Math.max(patternSize.x * (1 + parameters.offset*0.01), -parameters.spacing) var margin_x = patternSize.x + 2 * extraColumns * patternSize.x for (var c = column; x < outputSize.x + margin_x; x+= patternSize.x, c ++) { api.pushMatrix() // Set the seed based on the current row and column - this assures that the color will be modified // in the same way for the pattern in the neighboring selected area var seed = (row * 214013+ c * 2531011) % 0x7fffffff // //Engine.rand(seed) //Engine.rand(); // it helps to call rand a few times beforor using it since we are forcing the seed. var rc = parameters.colorRandomness // color randomness var br = 1 - parameters.brightnessRandomness + Engine.rand(seed) * parameters.brightnessRandomness*2 // brightness api.Color (kFillColor, br *(1 - rc + Engine.rand()*rc*2), br*(1 - rc + Engine.rand()*rc*2), br*(1 - rc + Engine.rand()*rc*2)) //api.scale(rand()*0.1 + 1) //api.rotate(-4 + Math.floor(rand()*60) / 7.5) // 60 distinct rotations - to help cache //api.rotate (Math.floor(rand()*10) * 18) api.rotate (parameters.rotateAngle) //追加 api.rotate (parameters.rotateAngleRandomness * Engine.rand() ) api.scale(scale) api.scale(parameters.patternScale) pattern.render(api) api.popMatrix() api.translateRel(patternSize.x, 0) if (restart) return; } api.popMatrix() api.translateRel(0, patternSize.y) } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Menu start // If you want to create a menu in which you change some of the script parameters, include the following code: // For shipped scripts we can include localized strings, prefixed with $$$/ - call method localize(string) on the prefixed string // For your own strings, you can query app.locale and select several language versions (for example, your native language and english). Try alert ("Language is: " + app.locale) var decoMenu = { // an object that defines the menu menuTitle : localize("$$$/DecoScripts/BrickFill/BrickFill=Brick Fill"), menuBackground : [0.93, 0.93, 0.93, 1], previewBackground : [1, 1, 1, 1], panels : [ { panelName : "", leftColumnWidth : 180, unitsWidth : 65, editTextWidth : 37, panelMenu : [ { itemName : localize("$$$/DecoScripts/PatternScale=Pattern Scale:") , itemUnit : "", itemType : 'slider', itemValue : modelParameters.patternScale, itemMin : 0.1, itemMax : 1.25, itemStep : 0.01, varName : 'patternScale' }, { itemName : localize("$$$/DecoScripts/BrickFill/Spacing=Spacing:"), itemUnit : localize("$$$/DecoScripts/Units/pixels=pixels"), itemType : 'slider', itemValue : modelParameters.spacing, itemMin : -patternSizeForDialog+1, itemMax : Math.max(100, 3 * patternSizeForDialog), itemStep : 1, varName : 'spacing' }, { itemName : localize("$$$/DecoScripts/BrickFill/Offset=Offset between rows:") , itemUnit : localize("$$$/DecoScripts/Units/percentOfWidth=% of width"), itemType : 'slider', itemValue : modelParameters.offset, itemMin : -100, itemMax : 100, itemStep : 0.1, varName : 'offset' }, { itemName : localize("$$$/DecoScripts/ColorRandomness=Color randomness:"), itemUnit : "", itemType : 'slider', itemValue : modelParameters.colorRandomness, itemMin : 0, itemMax : 1, itemStep : 0.01, varName : 'colorRandomness' }, { itemName : localize("$$$/DecoScripts/BrightnessRandomness=Brightness randomness:"), itemUnit : "", itemType : 'slider' , itemValue : modelParameters.brightnessRandomness, itemMin : 0, itemMax : 1, itemStep : 0.01, varName : 'brightnessRandomness' }, { itemName : localize("$$$/DecoScripts/BrickFill/rotateAngle=Pattern rotate angle:"), itemUnit : localize("$$$/DecoScripts/Units/degrees=degrees"), itemType : 'slider', itemValue : modelParameters.rotateAngle, itemMin : -180, itemMax : 180, itemStep : 1, varName : 'rotateAngle' } //追加 , { itemName : localize("$$$/DecoScripts/BrickFill/rotateAngleRandomness=Pattern random rotate angle:"), itemUnit : localize("$$$/DecoScripts/Units/degrees=degrees"), itemType : 'slider', itemValue : modelParameters.rotateAngleRandomness, itemMin : 0, itemMax : 180, itemStep : 0.1, varName : 'rotateAngleRandomness' } //追加おわり ] } ] // end of panels }; // end of menu // If livePreview is set to 1, the preview image is updated live. Note that due to limitations of scripted menus the update is slow and the flickering may be disturbing. livePreview = 0 // recommended value is 0 // Call Photoshop Script that creates the menu Engine.evalFile ("_Deco Menu.jsx") // Menu finished ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if (typeof skipRun == 'undefined' || !skipRun) // run unles we exited the preview window without pressing a button run(RenderAPI, modelParameters, 1)
気づいた事
・マスクが使えない(重なり合う所はNG)
0 件のコメント:
コメントを投稿