`
honlin
  • 浏览: 20129 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

半自动化创建Ext的theme

    博客分类:
  • ext
阅读更多

半自动化创建Ext的theme

photoshop CS3 extended 10.0支持javascript,可以通过脚本的方式来实现主题的创建,步骤如下:

  1. 创建一个 imageParser.jsx文件。
  2. 用photoshop打开extjs/resources/images/default/panel/tool-sprites.gif。
  3. 调整色相/饱和度值,确定着色复选框被选中。
  4. 记住以上调整的值,后面将会使用。
  5. 关闭tool-sprites.gif文件。
  6. 用文本文件打开imageParser.jsx。
  7. 根据以上记录的值,改变变量h,s,和l的值。
  8. 保存文件。
  9. 创建一个文件夹,作为脚本的输出。如extjs/resources/images/lihj-theme。
  10. 在photoshop中,选择 文件->脚本->浏览…。
  11. 选择 imageParser.jsx。
  12. 选择输入文件夹,通常使用extjs/resources/images/default作为输入。
  13. 选择输出文件夹,用9创建的文件夹。
  14. 选择OK。

CSS文件的更新:
  1. 打开extjs/resources/css/ext-all.css。
  2. 用lihj-theme/替换所有的default/ 。
  3. 保存这个CSS文件,重命名为lihj-theme.css。

通过以上步骤,即完成了一个ext主题的制作。

注意:以上脚本只是创建了已经存在文件的着色版本,任何感官上的变化都不在本帖讨论的范围。



imageParser.jsx:

// written for Adobe Photoshop CS3 Extended 10.0 - may not work with your version
// ExtJs Theme Modifier

#target photoshop
app.bringToFront(); // bring top
$.localize = true; // Enable ZString localization

//
// Change the hue/saturation/light values
//
// These values are easily determined by opening a file in photoshop
// altering the h/s/l and recording the values.
// -- colorize was turned on for me
//
// h = 0, s = 25, l = 0 is a nice bronzish color
// h = 113, s = 38, l = -1 is a greenish color
//
var h = 0; // hue
var s = 25; // saturation
var l = 0; // light (this is the letter L, not the number 1)

// debug settings
var debug = true;
var debugFile = '~/Desktop/image-parser.log';
var debugFh, linefeed; // don't modify these. debug file handle and linefeed char

// files to skip during the hue/saturation/light step
var exclude = {
'':{ // top level dir
 's.gif':true,
 'shadow-c.png':true,
 'shadow-lr.png':true,
 'shadow.png':true
},
dd:{
 'drop-add.gif':true,
 'drop-no.gif':true,
 'drop-yes.gif':true
},
editor:{
 'tb-sprite.gif':true
},
form:{
 'error-tip-corners.gif':true,
 'exclamation.gif':true
},
grid:{
 'arrow-left-white.gif':true,
 'arrow-right-white.gif':true,
 'columns.gif':true,
 'dirty.gif':true,
 'done.gif':true,
 'drop-no.gif':true,
 'drop-yes.gif':true,
 'grid-loading.gif':true,
 'group-by.gif':true,
 'hd-pop.gif':true,
 'hmenu-asc.gif':true,
 'hmenu-desc.gif':true,
 'hmenu-lock.gif':true,
 'hmenu-lock.png':true,
 'hmenu-unlock.gif':true,
 'hmenu-unlock.png':true,
 'invalid_line.gif':true,
 'loading.gif':true,
 'nowait.gif':true,
 'page-first-disabled.gif':true,
 'page-last-disabled.gif':true,
 'page-next-disabled.gif':true,
 'page-prev-disabled.gif':true,
 'refresh.gif':true,
 'wait.gif':true
},
layout:{
 'mini-bottom.gif':true,
 'mini-left.gif':true,
 'mini-right.gif':true,
 'mini-top.gif':true
},
shared:{
 'blue-loading.gif':true,
 'calendar.gif':true,
 'large-loading.gif':true,
 'warning.gif':true
},
tabs:{
 'tab-strip-bg.png':true // empty image??
},
tree:{
 'drop-add.gif':true,
 'drop-between.gif':true,
 'drop-no.gif':true,
 'drop-over.gif':true,
 'drop-under.gif':true,
 'drop-yes.gif':true,
 'folder.gif':true,
 'folder-open.gif':true,
 'leaf.gif':true,
 'loading.gif':true,
 's.gif':true
},
window:{
 'icon-error.gif':true,
 'icon-info.gif':true,
 'icon-question.gif':true,
 'icon-warning.gif':true
}
};

// modify nothing beneath this line

// hue/saturation/light function gotten off of the internets
function hueSaturationLight(hue, saturation, light){
 var aDesc = new ActionDescriptor();
 var userInput = new ActionDescriptor();
 var aList = new ActionList();

 with(userInput){
 putInteger(charIDToTypeID("H "), hue);
 putInteger(charIDToTypeID("Strt"), saturation);
 putInteger(charIDToTypeID("Lght"), light);
 }

 aDesc.putBoolean(charIDToTypeID("Clrz"), true);
 aList.putObject(charIDToTypeID("Hst2"), userInput);
 aDesc.putList(charIDToTypeID("Adjs"), aList);
 executeAction(charIDToTypeID("HStr"), aDesc, DialogModes.NO);
}

// save the current preferences
var startDisplayDialogs = app.displayDialogs;

// set no dialogs
app.displayDialogs = DialogModes.NO;

// ask the user for the input folder
var inputFolder = Folder.selectDialog("Select a folder for the input files. Example: extjs/resources/images/default");

// ask the user for the output folder
var outputFolder = Folder.selectDialog("Select a folder for the input files. Example: extjs/resources/images/bronze");

function log(string){
 if (!debug)return;
 if (!debugFile)return;
 if (!linefeed){
 if ($.os.search(/windows/i) != -1){
 linefeed = "windows";
 } else {
 linefeed = "macintosh";
 }
 }

 if (!debugFh) {
 // create a reference to the logfile
 debugFh = new File(debugFile);
 debugFh.lineFeed = linefeed;
 debugFh.open('w', "TEXT", "????");
 debugFh.write('Debug Report for imageParser.jsx: '+ new Date() + '\n');
 }

 if (debugFh){
 // write the string to the file
 var string = string || '';
 debugFh.write(string+'\n');
 }
}

function processFiles(args){
 var folder = args.folder;
 var f = folder.getFiles();
 if (f && f.length > 0){
 for (var i = 0; i < f.length; i++){
 if (f[i] instanceof Folder) {
 // traverse into this folder
 log(f[i].name+' is a Folder.. traverse');
 processFiles({folder:f[i]});
 } else {
 log(f[i]+' ... checking');

 var processFile = true;

 // exclude index files
 if ( -1 != f[i].fsName.indexOf('Thumbs.db'))continue;
 if ( -1 != f[i].fsName.indexOf('.DS_Store'))continue;
 if ( -1 != f[i].fsName.indexOf('.psd'))continue;

 // only process files that contain a .gif, .png, or .jpg
 if ( ! (f[i].fsName.indexOf('.gif') > -1 ||
 f[i].fsName.indexOf('.png') > -1 ||
 f[i].fsName.indexOf('jpg') > -1 ) ) {
 log(' ... not a gif, png, or jpg');
 processFile = false;
 }

 // check to see if the current folder is the top-level one
 var pName = (f[i].parent.name === inputFolder.name) ? '' : f[i].parent.name;

 // don't process this file if it is in our 'exclude' list
 if (exclude[pName] && exclude[pName][f[i].name]){
 log(' ... is in the exclude list');
 processFile = false;
 }

 var doc = app.open(File(f[i]));
 if (doc){
 if (processFile){
 log(' ... performing hue/sat/light');
 hueSaturationLight(h,s,l); // vars set at teh top of the file
 }

 // Determine which file save settings to use.
 // I couldn't find an image filetype parameter so i'm parsing the filename
 // This of course, is easily broken by funky filenames

 var saveOptions;
 if (f[i].fsName.indexOf('.gif') > -1){
 saveOptions = new GIFSaveOptions();
 saveOptions.transparency = true;
 } else if (f[i].fsName.indexOf('.png') > -1){
 saveOptions = new PNGSaveOptions();
 } else if (f[i].fsName.indexOf('.jpg') > -1){
 saveOptions = new JPEGSaveOptions();
 } else {
 // not one of the three types
 }
 log(' ... setting save options');

 if (saveOptions){
 // save the file to the folder/subfolder requested by the user
 var sFile = outputFolder+'/';
 if (pName) {
 sFile += pName +'/';
 }
 sFile += f[i].name;

 if (pName){ // if not the top-level folder
 var tFolder = new Folder(outputFolder+'/'+pName);
 if (!tFolder.exists){
 tFolder.create();
 }
 }
 doc.saveAs(new File(sFile), saveOptions);
 log(' ... saved: '+sFile);
 }

 // close orig file. do not save changes
 doc.close(SaveOptions.DONOTSAVECHANGES);
 }
 }
 }
 }
 log(); // blank line for readability
}

// work with the folders selected by the user
if (inputFolder !== null && outputFolder !== null){
 log(); // blank line for readability
 log('Input Folder: '+inputFolder);
 log('Output Folder: '+outputFolder);
 log(); // blank line for readability

 // if the input folder isn't the output folder
 // try to play nicely.. not overwrite the source file
 if (inputFolder !== outputFolder){
 processFiles({folder:inputFolder});
 } else {
 log('Input and Output folders are the same');
 alert('Sorry. Input and output folders can not be the same folder.');
 }
}

function cleanup(){
 // nullify var and close file handles
 if (debugFh){
 debugFh.close();
 alert('Log file saved to: '+debugFile);
 }

 // restore settings
 if (startDisplayDialogs){
 app.displayDialogs = startDisplayDialogs;
 }
}

cleanup();


分享到:
评论

相关推荐

    ibatis半自动化orm映射

    标题 "ibatis半自动化ORM映射" 涉及的核心技术是iBatis,这是一个流行的Java数据访问框架,用于实现对象关系映射(ORM)。ORM的主要目标是将数据库操作与业务逻辑解耦,使得开发人员可以更专注于业务代码,而无需...

    半自动化灰度检测对隐匿性肋骨骨折的辅助诊断.pdf

    "半自动化灰度检测对隐匿性肋骨骨折的辅助诊断" 本研究探讨半自动化灰度检测对肋骨骨折的诊断能力,旨在提高肋骨骨折的诊断率。研究结果表明,半自动化灰度检测对隐匿性肋骨骨折的诊断率显著高于初诊影像的诊断率,...

    办公室半自动化JBOA

    "办公室半自动化JBOA"是一个基于JAVA技术的办公自动化管理系统,简称为JBOA。这个系统巧妙地利用了SSH(Struts2、Spring、Hibernate)框架,这是一套广泛应用于企业级应用开发的开源技术栈。Struts2作为MVC(模型-...

    浅谈半自动化构件预制场设计及应用.rar

    标题中的“浅谈半自动化构件预制场设计及应用”表明了本文将探讨的主题,主要集中在建筑行业的预制构件生产领域,特别是半自动化的生产方式。预制构件是指在工厂中预先制造的建筑组件,如梁、板、柱等,然后运输到...

    音视频数据半自动化标注方法.pdf

    音视频数据半自动化标注方法涉及的主要知识点包括: 1. 数据标注:数据标注是将数据按照一定的标准和规则进行标记的过程。在人工智能领域中,数据标注尤其重要,因为标注数据的质量直接影响到机器学习模型的性能。...

    行业文档-设计装置-一种半自动化墙体机械喷浆抹灰的施工架.zip

    本文将深入探讨标题“行业文档-设计装置-一种半自动化墙体机械喷浆抹灰的施工架”所涵盖的知识点,以及在实际应用中可能涉及到的相关技术。 首先,"半自动化墙体机械喷浆抹灰"是指利用机械设备来辅助人工完成墙体的...

    spring+mybatis半自动化操作数据库

    一直不明白mybaitis根据pdm(powerdesign类型的文件)自动生成bean,mapper.xml,以及操作数据库的接口类,并没有看到接口类的实现,但是却可以正常使用操作数据库,觉得很神奇。今天模仿他们实现了一个简单的例子,并...

    nginx半自动化注册服务

    # 声明:由于暂时未集成bat动态修改xml文件内容的方案,所有形成了半自动化注册服务工具,等集成此功能后,本系统会同步升级 # 声明:不方案仅为个人学习使用所创建,不计划用于商业用途,希望能对您产生帮助 # 如果...

    半自动化系统在集装箱起重设备中的研究与应用.rar

    半自动化系统在集装箱起重设备中的研究与应用是一个深入探讨如何利用现代科技提升传统港口作业效率的主题。这篇PDF文档可能详细阐述了以下关键知识点: 1. **半自动化系统定义**:半自动化系统是一种结合了人工操作...

    半自动化PCB焊锡平台的电路控制系统设计.pdf

    1. 半自动化PCB焊锡平台的设计背景和必要性: - 目前,焊接行业主要面临的问题是人工焊接成本高、效率低、质量难以保证,同时大型焊接平台成本高昂且不适用于小批量生产。 - 针对这些问题,研发了半自动化PCB焊锡...

    工业半自动化数据采集终端解决方案.pdf

    工业半自动化数据采集终端解决方案.pdf工业半自动化数据采集终端解决方案.pdf工业半自动化数据采集终端解决方案.pdf工业半自动化数据采集终端解决方案.pdf工业半自动化数据采集终端解决方案.pdf工业半自动化数据采集...

    比较半自动化与人工视频新闻质量.pdf

    在研究中,通常会涉及到对于人工制作的视频新闻和半自动化视频新闻质量的比较。半自动化视频新闻是结合了人工智能技术的视频制作过程,它的特点是能够借助计算机程序和算法,部分地或全自动地完成视频的编辑、制作和...

    天合新电控单元为半自动化驾驶提供核心技术.rar

    在现代汽车技术中,半自动化驾驶正逐渐成为主流,而电控单元(Electronic Control Unit,简称ECU)作为车辆电子系统的核心,对于实现这一目标至关重要。"天合新电控单元为半自动化驾驶提供核心技术"这个主题揭示了...

    比较半自动化与人工视频新闻质量.rar

    标题中的“比较半自动化与人工视频新闻质量”指的是在新闻制作过程中,探讨自动化技术与传统人工方式对视频新闻质量的影响。这一主题涉及到信息技术在媒体行业中的应用,特别是人工智能(AI)和机器学习如何改变新闻...

    电信设备-一种半自动化使用QQ通讯的方法.zip

    本资料"电信设备-一种半自动化使用QQ通讯的方法.zip"聚焦于利用QQ这一广泛使用的即时通讯工具实现半自动化的通信流程,旨在提高效率并优化用户体验。下面将详细探讨这一方法的核心要点。 QQ作为腾讯公司开发的一款...

    半自动化系统在集装箱起重设备中的研究与应用.pdf

    本文主要研究对象是应用于集装箱起重设备中的半自动化系统,具体研究内容是岸边集装箱起重机(简称岸桥)的半自动化技术。岸桥司机在操作室内通过触摸屏选择相应的车道号和船舱内的集装箱排号,并通过手柄上的半自动...

    化工管道半自动化预制在工程中的应用.rar

    《化工管道半自动化预制在工程中的应用》 在现代化工工程中,管道预制是一项至关重要的环节,它直接影响到工程的质量、进度以及安全。随着科技的进步,半自动化技术在化工管道预制中的应用日益广泛,大大提升了工作...

    行业分类-设备装置-半自动化油画笔清洗机.zip

    半自动化油画笔清洗机是一种专为油画艺术家和画室设计的高效、省力的设备,旨在简化油画创作过程中的清洁工作。在油画创作过程中,油画笔的清洗是必不可少的步骤,传统的手工清洗方法费时费力,而半自动化油画笔清洗...

    半自动化目标检测标注工具

    在这个场景中,我们讨论的是一个半自动化的目标检测标注工具,该工具特别设计用于处理只有一个目标且位置不变的情况。这种工具对于数据集创建、模型训练以及监控等任务来说非常有用。 目标检测的基本原理是通过深度...

Global site tag (gtag.js) - Google Analytics