武汉大学珞珈山水BBS论坛
武汉大学bbs,武汉大学论坛,武汉大学网站,武汉大学bbs论坛,武大bbs,珞珈山水,珞珈山水bbs,武大论坛,洛加山水,加洛山水
[回到开始]
[上一篇][下一篇]
发信人: ojh (不想骗人的骗子), 信区: Photography
标 题: photoshop script加EIXF信息程序的优化
发信站: BBS 珞珈山水站 (Mon Jun 23 13:58:13 2008)
昨天晚上在看照片,突然觉着以前编写的那个在PHOTOSHOP中利用SCRIPT给照片加LOGO的程
序编的不是很完善,想改过来。因为以前在使用SCRIPT时,为了统一较长的边是800,或者
600,不得不手动分筛横幅照片和竖幅照片,分别用不同的ACTION来改变图片的大小。这样
很不方便。想想看,如果有上百张照片要手动分开,还是有点累。
以前之所以没有直接写好,是有个难题,图像要进行两次输出,因为我要两次改变图像大
小,以适应不同贴图的需要,一个是边长为600px的,用来贴在MSN上,一个是长800px的,
用来贴在论坛里。第二次输出就需要在第一次输出以后回复到原始状态,重新改变图像大
小,然后重新绘上文字层,这样可以保证文字大小合适并且清晰。但是这样的话,就需要
保存原来的状态,这一点有难度。
想着,应该用SCRIPT实现生成快照的功能,这样就可以解决一定的劳动量了。上网查了查
,果然,还是可以实现的。下现是代码:
//建立快照
function takeSnapshot () {
var id686 = charIDToTypeID( "Mk " );
var desc153 = new ActionDescriptor();
var id687 = charIDToTypeID( "null" );
var ref119 = new ActionReference();
var id688 = charIDToTypeID( "SnpS" );
ref119.putClass( id688 );
desc153.putReference( id687, ref119 );
var id689 = charIDToTypeID( "From" );
var ref120 = new ActionReference();
var id690 = charIDToTypeID( "HstS" );
var id691 = charIDToTypeID( "CrnH" );
ref120.putProperty( id690, id691 );
desc153.putReference( id689, ref120 );
executeAction( id686, desc153, DialogModes.NO );
}
//提取最后一次生成的快照
function revertToLastSnapshot() {
var docRef = app.activeDocument;
var hsObj = docRef.historyStates;
var hsLength = hsObj.length;
for (var i = hsLength-1; i > -1; i--) {
if(hsObj[i].snapshot) {
docRef.activeHistoryState = hsObj.getByName('Snapshot ' + i);
break;
}
}
}
为了输出的方便,得获取文件名:
//获取目录名+文件名
var Path = AD.path.toString();
var SlashPos = Path.lastIndexOf('/');
if(SlashPos!=-1){ Path = Path.substring(SlashPos+1, Path.length)+" ";}
while(Path.indexOf('%20')!=-1){Path=Path.replace("%20"," ");}
var FileName = AD.name;
var DotPos = FileName.lastIndexOf('.');
if(DotPos != -1) { FileName = FileName.substring(0, DotPos); };
输出为网页优化的JPEG格式:
//保存文件
if(photoWidth>=700)
{
saveFile = new File("C:\Documents and Settings\gaziou\My Documents\My Pict
ures\xteck\"+FileName+".jpg");
}
else
{
saveFile = new File("C:\Documents and Settings\gaziou\My Documents\My Pict
ures\msnblog\"+FileName+".jpg");
}
saveOptions = new ExportOptionsSaveForWeb();
saveOptions.includeProfile = false;
saveOptions.format = SaveDocumentType.JPEG;
saveOptions.interlaced = 0;
saveOptions.optimized = true;
saveOptions.quality = 60;
AD.exportDocument(saveFile,ExportType.SAVEFORWEB, saveOptions);
判断照片的横竖幅,如果是竖幅,先转一下当横幅处理,处理完以后再转回去。
//获得文件的长与宽
var photoWidth = AD.width.value;
var photoHeight = AD.height.value;
//如果图片是竖版的先横置,并以swapTemp为标记如果swapTemp不为零最后再把它转回来
var swapTemp = 0;
if (photoWidth < photoHeight)
{app.activeDocument.rotateCanvas(90.0);
swapTemp = photoWidth;
photoWidth = photoHeight;
photoHeight = swapTemp;
}
……
……
//原来竖版的图片还原竖版状态
if (swapTemp!=0)
{
app.activeDocument.rotateCanvas(-90.0);
}
镜头的侦别,我是依据EXIF中的焦距长度来判断的。但其实这样依据不足。如果有焦距重
复的话会错判,现在我也没有办法。
if(stringTemp.indexOf("Focal Length")!=-1){
var focalLength =tempArray[n+1];
var focusIndex=focalLength.indexOf(" mm");
focusIndex-=2;
focalLength=focalLength.substring(0,focusIndex);
var r=parseInt(focalLength);
switch(r)
{
case 100:
{focalLength = '100mm F2.8 Macro USM, ';break;}
case 85:
{focalLength = '85mm F1.2L USM, ';break;}
case 14:
{focalLength="use 14mm F2.8 HSM.";break;}
case 0:
{focalLength="ManuFocus Lense";break;}
default:
{
if(r>=24&&r<=70)
{focalLength = '24-70mm F2.8L USM @'+focalLength+', ';break;}
else {
if(r>70&&r<=200)
{focalLength = '70-200mm F4L IS USM @'+focalLength+', ';break;
}
else
{focalLength="Unknown Lense@";break;}
}
}
}
}
大致就是这个样子了。改完都一点多了。看来一玩编程真容易搞到很晚。
下面是录相资料,大约看一下吧。
http://www.youtube.com/watch?v=iUKc8qmm92I
--
欢迎来http://qiuworld.com玩。
※ 来源:·珞珈山水BBS站 http://bbs.whu.edu.cn·[FROM: 133.1.131.*]
[回到开始]
[上一篇][下一篇]