質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

4回答

4489閲覧

MS Paintで画像を一括、あるいは自動で圧縮したい

Satochan24

総合スコア113

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

1クリップ

投稿2018/04/03 10:33

ペルプデスクのお手伝いをしてるのですが、担当者が、お客さんからデジカメの50個ほどの大量画像の圧縮を毎日のように一個ずつ、MS Paintで水平方向800ピクセルに圧縮していました。。。

あまりにも単調作業で、助けてあげたいと思い、VBScriptなら、MS Paintを使って、
自動や一括で圧縮できるのでは?と思ったのですが、今のところ、サンプルコードとかが見つかりませんでした。

何か方法ありませんでしょうか?
他の画像ソフトなら出来るとかでも良いかと思います。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

ガッツリスクリプトですが、Windows7以降プリインストールのPowerShellを使う手もあります。

以下のサンプルコードの使い方

  1. Windows PowerShell ISE を起動(Windowsキー→Powershellで検索すれば出てくるはず)
  2. 画面上の白いところ(無題~のタブの下)にコードをコピペ
  3. $画像の保存されているフォルダなどを指定
  4. 実行(上の緑色の▶ボタン or F5)

powershell

1# 設定項目 2[string]$画像の保存されているフォルダ = 'C:\Users\TestUser\Pictures' 3[string]$縮小した画像の保存先 = '{0}\圧縮画像' -f $画像の保存されているフォルダ 4[int]$画像の横幅 = 800 #px 5 6[string]$元の画像の拡張子 = '*.jpg' 7 8 9# 画像操作に必要なライブラリ読み込み 10Add-Type -AssemblyName System.Drawing 11[Drawing.Imaging.ImageFormat]$縮小後画像の形式 = [Drawing.Imaging.ImageFormat]::Jpeg 12 13# 出力先のフォルダを作成(すでにある場合は何もしない) 14[IO.Directory]::CreateDirectory( $縮小した画像の保存先 ) > $null 15 16# $画像の保存されているフォルダ の中から、$元の画像の拡張子 でフィルターしたものを探す 17Get-ChildItem -LiteralPath $画像の保存されているフォルダ -Filter $元の画像の拡張子 | 18 %{ 19 # 見つかったものそれぞれに対して処理 ( $_ -is [IO.FileInfo] ) 20 21 # 元となる画像読み込み 22 [Drawing.Bitmap]$srcBmp = [Drawing.Bitmap]::FromFile($_.FullName) 23 # 画像のメタデータ(撮影日時など)取得 24 [Drawing.Imaging.PropertyItem[]]$props = $srcBmp.PropertyItems 25 26 27 # 新しい画像の大きさを計算 28 [int]$newWidth = $画像の横幅 29 [int]$newHeight = [int]( ($srcBmp.Height / $srcBmp.Width) * $newWidth ) 30 31 # 縮小した画像を作成(メモリ内) 32 [Drawing.Bitmap]$destBmp = 33 New-Object -TypeName Drawing.Bitmap -ArgumentList $srcBmp, $newWidth, $newHeight 34 # 画像のメタデータ(撮影日時など)設定 35 $props | %{ $destBmp.SetPropertyItem( $_ ) <# $_ -is [Drawing.Imaging.PropertyItem] #> } 36 37 # 縮小した画像の保存先 38 [string]$destPath = [IO.Path]::Combine( 39 $縮小した画像の保存先, 40 [IO.Path]::ChangeExtension($_.Name, $縮小後画像の形式.ToString())) 41 42 # ファイルの存在確認 43 if ( Test-Path -LiteralPath $destPath ) { 44 Write-Host ('「{0}」はすでに存在しています。' -f [IO.Path]::GetFileName($destPath)) 45 } else { 46 # $縮小後画像の形式 で保存 47 $destBmp.Save($destPath, $縮小後画像の形式) 48 Write-Host ('「{0}」を「{1}」として保存しました。' -f $_.Name, [IO.Path]::GetFileName($destPath)) 49 } 50 51 # 片付け 52 $destBmp.Dispose() 53 $srcBmp.Dispose() 54 } 55 56# 保存したフォルダを開く 57explorer.exe $縮小した画像の保存先

実行ポリシーによる制限を解除するコード

posh

1Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 2 3# 省略形 4Set-ExecutionPolicy RemoteSigned CurrentUser

投稿2018/04/03 12:59

編集2018/04/06 09:17
imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2018/04/03 13:16

おっ!スクリプトですね。 有難うございます。 因みに縦横比は、固定での水平方向800ピクセルなのですが、 大丈夫でしたでしょうか…(^^;;
imihito

2018/04/03 13:29

「# 新しい画像の大きさを計算」の箇所で計算しています。 例えば幅4000、高さ3000の画像であれば `($srcBmp.Height / $srcBmp.Width) * $newWidth` -> (3000 / 4000) * 800 -> 600 の高さで保存されます。
Satochan24

2018/04/05 12:09

有難うございました。 ps1のファイルにすると専用端末に、制限があるのか、失敗しましたが、 コピペして実行なら、 無事、成功しました! ペルプデスクの人もかなり喜んでくれました! 他のやり方はまだ確認出来てないですが、一番確実な方法だと思いました。
imihito

2018/04/05 12:57

一般的なWindowsOSでは、PowerShellの「実行ポリシー」という機能によってps1ファイルを実行できないようになっています (マクロウイルスのように、不用意に触って動作させてしまうことを防ぐためのセキュリティ的措置です) ps1の形で実行したい場合は、実行したい端末で下記コードを実行し、表示されるダイアログで「はい」を押せば、そのユーザーに対して制限を解除できます(一度実行すれば、それ以降は不要です) ```posh Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser # 省略形 Set-ExecutionPolicy RemoteSigned CurrentUser ``` ただし、この制限はセキュリティ的観点からのもののため一応注意はしておいてください
Satochan24

2018/04/06 01:38

回答、有難うございます。 すみません。1点問題がありました。 デジカメの写真ですが、撮影日時が消えているとお客さんから電話がありました。どうもデジカメで撮ると撮影日時がプロパティに残るようです。 恐らくタイムスタンプとかだと思うのですが、撮影日時を残したまま圧縮は可能でしょうか? ファイルをコピーではなく、元画像をそのまま圧縮すれば可能なのかと思いましたが…
imihito

2018/04/06 09:19

回答のコードを修正しました デジカメということでそこまで考慮すべきでしたね……
Satochan24

2018/04/06 11:20

何度も有難うございました。 週明けに、また確認してみます。 ペルプデスクの人達も、かなり喜んでくれると思います。
Satochan24

2018/04/09 13:11

今日、確認して、成功しました。 有難うございます。 制限を解除するコードは、 一度失敗したのですが、専用端末がローカルにファイルを保存できない仕組みになっていて、ネットワークドライブから実行してたためでした。Unrestricted に変更したら、無事、ps1ファイルからも実行出来ました! 他の業務に忙しい時は、圧縮作業がほぼ一瞬で終わるので、精神的に楽になりました。 ホントに有難うございました。 m(_ _)m
guest

0

直接的な回答ではありませんが, Windows環境であればInternet ExplorerをWSH(JScript)で制御し, canvas要素を使って画像処理を行う方法があります.

xml

1<job id="main"> 2<script language="javascript"> 3(function(){ 4try{ 5 //IEの起動(非表示とする) 6 var ie = WScript.CreateObject("InternetExplorer.Application"); 7 ie.Navigate("about:blank"); 8 ie.Visible = false; 9 10 //base64変換用(画像の入出力に用いる) 11 var node = WScript.CreateObject("Microsoft.XMLDOM").createElement("dummy"); 12 node.dataType = "bin.base64"; 13 14 //document,windowオブジェクトの入手 15 var document = ie.document; 16 var window = document.parentWindow;//※必要であれば 17 18 //canvas要素の設定 19 var canvas = document.createElement("canvas"); 20 canvas.width = canvas.height = 200; 21 22 //グラフィックの描画 23 var ctx = canvas.getContext("2d"); 24 ctx.fillStyle = "yellow"; 25 ctx.fillRect(0, 0, 200, 200); 26 27 //ローカル画像の描画(画像はバイナリで取得しbase64形式とする) 28 var strin = WScript.CreateObject("ADODB.Stream"); 29 strin.Open(); 30 strin.Charset = "iso-8859-1"; 31 strin.Type = 1;//binary 32 strin.LoadFromFile("in.jpg"); 33 node.nodeTypedValue = strin.Read(); 34 strin.Close(); 35 var img = document.createElement("img"); 36 img.src = "data:;base64," + node.text;//IEは画像形式を自動判定する 37 while(!img.complete) WScript.sleep(100);//NOTE:イベントを用いずともよい 38 ctx.drawImage(img, 25, 25, 150, 150); 39 document.body.appendChild(canvas); 40 41 //カンバスグラフィックの保存(base64形式をバイナリ形式に変換する) 42 node.text = canvas.toDataURL("image/png").split(",")[1]; 43 var strout = WScript.CreateObject("ADODB.Stream"); 44 strout.Open(); 45 strout.Charset = "iso-8859-1"; 46 strout.Type = 1; 47 strout.Write(node.nodeTypedValue); 48 strout.SaveToFile("result.png", 2);//overwrite 49 strout.Close(); 50 51 WScript.echo("処理完了"); 52}catch(e){ 53 WScript.echo(e.message); 54}finally{ 55 ie.Quit(); 56} 57})();

その他にもこんなやりかたが考えられるでしょう.

  • (アプリケーションを導入してもよいのであれば)ImageMagicを用いて画像の変換処理をバッチ化する方法があります.

https://www.imagemagick.org/script/index.php

  • PhotoShopがインストールされている環境であれば, PhogoShopをWSHで操作する方法があります.

投稿2018/04/03 10:56

defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2018/04/03 11:08

興味深い方法有難うございます。 もう少し、自分でも試してみます。 長期出張中なので、自由に使えるPCがなくて、時間かかりそうですが…(^^;;
guest

0

断然オススメなのは XnViewですね。

窓の杜ではビューアとして紹介されていますが、編集ソフトとしても強力です。

一括変換というメニューがあり、フォルダ内の全画像を水平方向800ピクセルに変換するなどということはメニューからの選択で簡単にできます。
また簡単なマクロを組んで、サイズ変更→色数変更→pngからjpgに変換など、複数の処理を一気に実行する事も可能です。

投稿2018/04/03 13:08

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2018/04/03 13:14

回答ありがとうございます。 水平方向800ピクセルは、もちろん 縦横比固定ですが、大丈夫ですよね!? やはり、フリーツール使うのが手っ取り早いみたいですね。 可能ならスクリプトに挑戦したかったのですが、恐らく簡単ではないんでしょう。(^^;;
KojiDoi

2018/04/03 13:29

> 縦横比固定ですが、大丈夫ですよね!? 一とおりのオプションは備わっています。 > スクリプトに挑戦したかったのですが、 それなら imageMagick一択だと思います。
guest

0

「一括画像変換」でぐぐると、それらしいツールが出てきます。
どうでしょうか

投稿2018/04/03 10:50

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

defghi1977

2018/04/03 10:59

スクリプトでやるより、ツールの使い方を憶えてもらったほうが後腐れなくて良い気がしますね 下手にプログラム組むとずっとメンテナンスする羽目になりそうで
y_waiwai

2018/04/03 11:02

まあ、こういうので出てくるツールはちと怪しげなのが玉に瑕ですが。。 DOWNLOADのボタンがあちこちにあるとかw
Satochan24

2018/04/03 11:10

有難うございます。専用端末なので、恐らくフリーのソフト導入は難しい気がしますが、確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問