スポンサーサイト

Tags :
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Photoshopで画像のサムネイルを作成し一覧のHTMLを書き出すAppleScript

ドロップしたフォルダの中にある画像ファイルのサムネイルをPhotoshopを使って作成し、それを一覧表示するHTMLを生成してファイルに書き出すAppleScript。

生成されたHTMLをブラウザで表示するとこんな感じになります。


サムネイルの生成には、Photoshopを使う以外にもOS Xに付属のImageEvents(sips)やFinkでインストールしたImageMagickも試して見たんですが、ImageEvents(sips)はEPSが扱えないのでダメだったり(pstopdfコマンドで一旦PDFに変換する方法もありますが時間が掛かりすぎるので却下)、ImageMagickはサイズの大きい画像を処理する時やたら時間が掛かったりエラーで落ちてしまったりで、結局Photoshopでやるのが無難でした。EPSを処理する場合はImageMagickの方が速かったような気がします。

なんでこれを作ったかと言うと、ウチの職場ではDVDに画像をバックアップしたあとAppleScriptを使ってWebベースのアプリに注番やら品名を登録してるんですが、どうせなら画像の一覧が見れた方が良いなと思い、サムネイルを作成する部分を作ってみたわけです。で、生成したHTMLをWebアプリに登録する注番にリンクしたり、サーバにアップロードする処理も付け加えていこうかなと。まあやってみたかっただけなんですけど。

■使い方
サムネイルのフォルダとHTMLを保存するディレクトリの部分と、(* サムネイルの生成 *)部分の使用するPhotoshopのバージョンを適宜書き換え、アプリケーションとして保存し、画像が入ったフォルダをドロップします。
ドロップしたフォルダ単位でHTMLが生成されます。(スクリプト中ではドロップされたフォルダを"Job"として扱ってます)

■動作確認
MacOSX10.4.11 & PhotoshopCS3
MacOSX10.3.9 & PhotoshopCS2
--作業用ディレクトリのパス。※要書き換え※
property work_dir : "Macintosh HD:Users:USERNAME:Desktop:Works"

--サムネイルの長辺のピクセル数
property thumb_size : 120

property html_top : "<html>
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">
<style type=\"text/css\">
body { background: #ccc; margin-top: 30px; }
#container { width: 85%; margin-left: auto; margin-right: auto; }
table { border-collapse: collapse; color: #333; background: #fff; font-size: 0.8em; }
td { padding: 5px; text-align: center; width: 120px; border: #aaa solid 1px; }
</style>
</head>
<body><div id=\"container\">
"
property html_bottom : "
</table></div></body>
</html>"
global target_list
global job_num
on open drop
	set start_time to current date
	set html_top to html_top as text
	set html_bottom to html_bottom as text
	set job_num to 1
	tell application "Finder"
		repeat with this_job in drop
			set target_list to {}
			
			(* JobごとのHTMLファイルとサムネイルを保存するフォルダを作成 *)
			set html_filename to "thumb_" & job_num & ".html"
			set html_fileRef to (make file with properties {name:html_filename} at work_dir) as alias
			open for access html_fileRef with write permission
			set title_html to "<p style=\"{font-weight: bold; font size: 1.5em;}\">[" & name of this_job & "] : の画像一覧</p>" & return as text
			write html_top & title_html & "<table>" & return to html_fileRef
			set dest_dir to "thumb_" & job_num as Unicode text
			make new folder with properties {name:dest_dir} at work_dir
			if kind of this_job is "フォルダ" then
				set job_contents to every item of this_job
			else
				set job_contents to this_job as list
			end if
			
			(* Jobに含まれるアイテムをリストに格納*)
			repeat with theItem in job_contents
				my set_itemsToList(theItem, target_list)
			end repeat
			
			(* リスト中のファイルを処理*)
			set img_n to 1
			set col_n to 0
			repeat with theFile in target_list
				set html_tbody to "" as text
				if my is_imageFile(theFile) is true then --画像ファイルの場合のみ処理する
					set fName to name of theFile as Unicode text
					set thumb_name to "job" & job_num & "-" & img_n & ".jpg"
					set thumb_path to (work_dir & ":" & dest_dir & ":" & thumb_name)
					my create_thumb(theFile, thumb_path)
					if col_n is 0 then
						set html_tbody to html_tbody & "<tr>" & return
					else
						if col_n is 5 then
							set html_tbody to html_tbody & "</tr>" & return
							set col_n to 0
						end if
					end if
					set html_tbody to html_tbody & "<td><img src=\"" & dest_dir & "/" & thumb_name & "\">" & "<br>" & fName & "</td>" & return as text
					write html_tbody to html_fileRef
					set img_n to img_n + 1
					set col_n to col_n + 1
				end if
			end repeat
			
			(* 仕上げ *)
			repeat 5 - col_n times --列の残りのコラムを<td>で埋める
				write "<td> </td>" to html_fileRef
			end repeat
			write html_bottom to html_fileRef
			close access html_fileRef
			set job_num to job_num + 1
		end repeat
		activate me
		beep
		display dialog "終了しました。" & return & "処理時間 : " & ((current date) - start_time) & "秒"
	end tell
end open


(* サムネイルの生成 *)
on create_thumb(tgt_file, dest_file)
	tell application "Adobe Photoshop CS4"
		activate
		open tgt_file showing dialogs never
		set theDoc to current document
		tell theDoc
			if width > height then
				resize image width thumb_size as pixels resolution 72 resample method bicubic
			else
				resize image height thumb_size as pixels resolution 72 resample method bicubic
			end if
			change mode to RGB
			convert to profile "sRGB IEC61966-2.1" intent relative colorimetric with blackpoint compensation and dithering
			set save_opts to {class:JPEG save options, embed color profile:false, quality:10}
			save in file dest_file as JPEG with options save_opts appending no extension with copying
			close without saving
		end tell
	end tell
end create_thumb


(* アイテムを再帰的にリストに格納 *)
on set_itemsToList(thePath, target_list)
	tell application "Finder"
		if not kind of thePath is "フォルダ" then
			set end of target_list to thePath as alias
		else
			set theFolders to every folder of thePath
			repeat with aFolder in theFolders
				my set_itemsToList(aFolder, target_list)
			end repeat
			set theFiles to every file of thePath
			repeat with aFile in theFiles
				set end of target_list to aFile as alias
			end repeat
		end if
	end tell
end set_itemsToList


(* 画像かどうかを判別 *)
on is_imageFile(theFile)
	tell application "Finder"
		set fPath to POSIX path of theFile as Unicode text
		if kind of theFile is "Adobe Photoshop ファイル" or kind of theFile is "Adobe Photoshop EPS ファイル" then
			return true
		else
			try
				set fType to 2nd word of (do shell script "sips -g all " & quoted form of fPath & " | grep format")
				if fType is "psd" or fType is "tiff" or fType is "jpeg" or fType is "gif" or fType is "png" then return true
			on error
				return false
			end try
		end if
		return false
	end tell
end is_imageFile

PhotoshopCS2用AppleScriptドロップレット小ネタ2つ

仕事で入り用だったので書いたやつ。

『RGB画像にラベルを付ける』
そのまんま。sipsがEPSに対応しててくれればわざわざPhotoshopで開かなくても良いんだけど。
■6/25修整■
on open drop
    repeat with theFile in drop
        tell application "Adobe Photoshop CS2"
            open theFile
            set theDoc to current document
            if mode of theDoc is RGB then
                tell application "Finder"
                    set label index of theFile to 2
                end tell
            end if
            close theDoc
        end tell
    end repeat
    activate me
    beep
    display dialog "Finished."
end open


『レイヤもしくはアルファチャンネルのある画像をフォルダにまとめる』
ドロップした画像にレイヤもしくはアルファチャンネルがあれば、画像と同じフォルダ内の『has layers & alpha channels』の中にまとまります。
on open drop
    repeat with theFile in drop
        
        tell application "Finder"
            if (kind of theFile is "Adobe Photoshop ファイル") or (name of theFile contains ".psd") then
                set fPath to parent of theFile
            
                if not (exists folder "has layers & alpha channels" of fPath) then
                    make folder with properties {name:"has layers & alpha channels"} at fPath
                end if
            
                tell application "Adobe Photoshop CS2"
                    open theFile
                    set theDoc to current document
                    set docMode to mode of theDoc
                    if docMode is CMYK then
                        set cNum to 4
                    else if docMode is RGB then
                        set cNum to 3
                    else
                        set cNum to 0
                    end if
                    set numLayer to (count of art layers of theDoc) as string
                    set numAlpha to (count of channels of theDoc) as string
                    close theDoc
                end tell
            
                if (numLayer > 1) or ((numAlpha > cNum) and (cNum is not 0)) then
                    move theFile to folder "has layers & alpha channels" of fPath
                end if
            end if
        end tell
    end repeat
    activate me
    beep
    display dialog "Finished."
end open

PhotoshopCS2での操作を記録してJavaScriptで書き出す

こんなのが付属していたとは知りませんでした。PhotoshopCS2での操作を記録してJavaScriptで書き出すプラグイン。

『ScriptingListener.plugin』

Mac版のPhotoshopCS2では『Adobe Photoshop CS2/スクリプティングガイド/ユーティリティ』フォルダ内にあるので、これをプラグインフォルダに入れて起動すれば、デスクトップにファイル『ScriptingListenerJS.log』が作成され、操作した内容がどんどん記録されていきます。

こんな感じ。
// =======================================================
var id1878 = charIDToTypeID( "slct" );
    var desc387 = new ActionDescriptor();
    var id1879 = charIDToTypeID( "null" );
        var ref236 = new ActionReference();
        var id1880 = charIDToTypeID( "HstS" );
        var id1881 = charIDToTypeID( "Ordn" );
        var id1882 = charIDToTypeID( "Nxt " );
        ref236.putEnumerated( id1880, id1881, id1882 );
    desc387.putReference( id1879, ref236 );
executeAction( id1878, desc387, DialogModes.NO );

// =======================================================
var id1883 = charIDToTypeID( "slct" );
    var desc388 = new ActionDescriptor();
    var id1884 = charIDToTypeID( "null" );
        var ref237 = new ActionReference();
        var id1885 = charIDToTypeID( "HstS" );
        var id1886 = charIDToTypeID( "Ordn" );
        var id1887 = charIDToTypeID( "Prvs" );
        ref237.putEnumerated( id1885, id1886, id1887 );
    desc388.putReference( id1884, ref237 );
executeAction( id1883, desc388, DialogModes.NO );

// =======================================================

『シャープネス』や『ぼかし』なんかの定番フィルタはJavaScriptで記述できるメソッドが用意されてますが、『スケッチ』等に含まれるフィルタ類にはどう記述すればいいのか解らない物もあるので、その部分をScriptingListenerプラグインで書き出してスクリプトに組み込めば解決します。


試しに、以前デイリーポータルZでやってたネタっぽいのをJavaScriptでやってみました。画像をちょっと品質の悪いビデオキャプチャ風に加工します。

使用例。(手頃な画像が無かった…文字等はあらかじめ入れときます)


この程度ならわざわざスクリプト書かなくてもアクションで記録すれば良いんですが。これに任意の文字を入力出来て、グラデーションかける部分もJavaScriptで作れば面白いかもしれません。

『.jsx』ファイルとしてテキストを保存し、『ファイル→スクリプト→参照』から読み込むと実行されます。
#target photoshop
var originalUnit = preferences.rulerUnits ;
var docRef = activeDocument;

// 定規の単位をピクセルに
preferences.rulerUnits = Units.PIXELS;

//カラーモードをRGBに
docRef.changeMode(ChangeMode.RGB);

//描画色を黒、背景色を白に
app.foregroundColor.rgb.red = 0;
app.foregroundColor.rgb.green = 0;
app.foregroundColor.rgb.blue = 0;

app.backgroundColor.rgb.red = 255;
app.backgroundColor.rgb.green = 255;
app.backgroundColor.rgb.blue = 255;

//画像サイズを一旦幅1300pxにリサイズ
//(なんとなく経験則)
var wTmp = 1300;
var w = docRef.width;
var h = docRef.height;
//alert(w+","+h);
var eSize = wTmp/w;
//alert(eSize);
docRef.resizeImage(wTmp,h*eSize);

//画像を統合
docRef.flatten();

////レイヤを複製
var layObj = docRef.artLayers;
//layObj[layObj.length-1].opacity = 100;//背景に不透明度を設定するとレイヤに変わる
layObj[layObj.length-1].duplicate();
layObj[0].name = "フィルタ処理レイヤ";
layObj[0].blendMode = BlendMode.LUMINOSITY;

//フィルタ処理
//この部分はScriptingListenerJSで記録した物を使用
// =======================================================
//レイヤ『フィルタ処理レイヤ』をアクティブに
var id150 = charIDToTypeID( "slct" );
    var desc39 = new ActionDescriptor();
    var id151 = charIDToTypeID( "null" );
        var ref30 = new ActionReference();
        var id152 = charIDToTypeID( "Lyr " );
        ref30.putName( id152, "フィルタ処理レイヤ" );
    desc39.putReference( id151, ref30 );
    var id153 = charIDToTypeID( "MkVs" );
    desc39.putBoolean( id153, false );
executeAction( id150, desc39, DialogModes.NO );
// =======================================================
//フィルタ『ハーフトンパターン』を適用
var id154 = charIDToTypeID( "HlfS" );
    var desc40 = new ActionDescriptor();
    var id155 = charIDToTypeID( "GEfk" );
    var id156 = charIDToTypeID( "GEft" );
    var id157 = charIDToTypeID( "HlfS" );
    desc40.putEnumerated( id155, id156, id157 );
    var id158 = charIDToTypeID( "HlSz" );
    desc40.putInteger( id158, 1 );
    var id159 = charIDToTypeID( "Cntr" );
    desc40.putInteger( id159, 0 );
    var id160 = charIDToTypeID( "ScrT" );
    var id161 = charIDToTypeID( "ScrT" );
    var id162 = charIDToTypeID( "ScrL" );
    desc40.putEnumerated( id160, id161, id162 );
executeAction( id154, desc40, DialogModes.NO );
// =======================================================

//画像サイズを幅640pxにリサイズ
docRef.resizeImage(640,activeDocument.height*640/wTmp);
//ぼかし(強)
layObj[0].applyBlurMore () ;
//アンシャープマスクを適用
layObj[0].applyUnSharpMask(300,1.5,0);

// 定規の単位設定を元に戻す
app.preferences.rulerUnits = originalUnit;
Profile
choco
Author : choco

印刷・製版の現場を経て、広告制作会社でPhotoshopを使ったビジュアル制作を担当。

→現在は車載機器開発ベンダにて、組み込み3Dデータ作成やUIデザインなどを行っています。

Categories
Favorites


Search
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。