嫁さんがブログに上げる写真のサイズの変更方法がわからないし、面倒くさいということだったので、Windowsの標準機能で動くツールをvbsで作成しました。
ツールをダウンロードしに来た人は、本記事の一番下からダウンロードできます。本ツールはアスペクト比(縦横比)は固定です。参考・抜粋のため、紹介しているソースを張っても動きません。使うだけの人は、ダウンロードして使用してください。
VBS で jpg への変換とサイズ変更を同時に行うツールも紹介しています。ブログ投稿には以下がおすすめです。
ゴール
画像ファイルまたは、画像ファイルが保存されているフォルダをドラック&ドロップすることで、指定された拡縮率(指定横幅)にサイズ変更するツールを作る。
画像のサイズ変更が目的のためアスペクト比は固定。トリミングではない。
ソース解説
このプログラムの肝となるサイズ変更する関数は以下です。
16行目・17行目で、WIA.ImageProcess で指定された大きさ(率)のフィルタを作成し、18行目の Apply() で、WIA.ImageFile で取得したインプットファイルに適用します。これで、インプットファイルを拡縮処理したものが出来ます。これを20行目の SaveFile() で出力ファイルパスに保存します。インプットファイルは読むだけで変更しません。
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-imageprocess
WIA.ImageFile:
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-imagefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | Sub resizeImage(input, output, intScaleRatio) Dim objFso Dim objImg Dim objIp Set objFso = CreateObject( "Scripting.FileSystemObject" ) input = objFso.GetAbsolutePathName(input) output = objFso.GetAbsolutePathName(output) if objFso.FileExists(input) then Set objImg = CreateObject("WIA.ImageFile") objImg.LoadFile(input) Set objIp = CreateObject("WIA.ImageProcess") objIp.Filters.Add(objIp.FilterInfos("Scale").FilterID) objIp.Filters(1).Properties("MaximumWidth").Value = objImg.Width * (intScaleRatio/100) objIp.Filters(1).Properties("MaximumHeight").Value = objImg.Height * (intScaleRatio/100) Set objImg = objIp.Apply(objImg) objImg.SaveFile(objFso.GetAbsolutePathName(output)) End if Set objImg = Nothing Set objIp = Nothing Set objFso = Nothing End Sub |
ツールのダウンロード
以下からダウンロードしてください。
使い方
元ファイルは変更されないように作成していますが、特に初回は念のためバックアップをとってご利用ください。
- ダウンロードしたファイルを解凍します。.vbsファイルが1つ出てきます。
- .vbsファイルに対象の画像ファイルまたは、フォルダをドラック&ドロップします。
- ツールと同じディレクトリにoutというフォルダが作成されます。
- 拡縮比または、横幅を指定をして「OK」をクリックしてください。
- 処理が終了したら終了ダイアログが出ます。outの中に、同じファイル名でサイズ変更されたファイルが入ります。
Exif dpi設定版
コメントで質問をいただきましたが、特定の jpg/jpeg で画像がつぶれて見える問題があるようです。具体的には WIA.ImageProcess の Apply() で参照している可能性のある Exif 情報が無いか壊れている場合に起こると考えられます。この質問で利用した画像では、Exif TAGID の 282:XResolution (画面の幅の解像度) が正しく設定されていなかったようで、WIA.ImageProcess の Apply() 後に縦と横の解像度がズレてしまったと考えています。
そのためこの質問に対しては、対症療法として以下のように 282:XResolution (画面の幅の解像度) と 283:YResolution (画面の縦の解像度) を明示的に設定するコードを追加して回避しました。他にも必要な Exif があれば同じような感じで追加して対応も可能だと思います。一度 png にコンバートして Exif を削除してしまうのもありでしょう。jpg/jpeg のまま利用したいのであれば、不要な Exif を remove するのもありだと思います。
1 2 3 4 5 6 7 8 9 10 11 | If LCase(objFso.GetExtensionName(input)) = "jpg" Or LCase(objFso.GetExtensionName(input)) = "jpeg" Then objIp.Filters.Add(objIp.FilterInfos("Exif").FilterID) objIp.Filters(2).Properties("ID").Value = 282 objIp.Filters(2).Properties("Type").Value = 1005 objIp.Filters(2).Properties("Value").Value = 96 objIp.Filters.Add(objIp.FilterInfos("Exif").FilterID) objIp.Filters(3).Properties("ID").Value = 283 objIp.Filters(3).Properties("Type").Value = 1005 objIp.Filters(3).Properties("Value").Value = 96 End If |
使い方は、通常版と同じです。以下からダウンロード可能です。
Exif dpi設定版 拡縮率指定版
Exif dpi設定版 横幅指定版
コメント
こんにちは。
とても便利に使わせていただいてます!
ひとつ質問なのですが、一部の画像が正しくリサイズできません。
リサイズすると
水平方向の解像度が
350dpi→96dpi
垂直方向の解像度は350dpiまま
となってしまい、横長の画像が生成されます。
大体の画像は良い感じにリサイズ出来るのですが、画素が多いもの?はうまくいかないようです。
ようさん こんにちは。ご連絡ありがとうございます。
ひとまず手元で簡単に試してみました。
A0サイズ(841mmx1189mm)の350dpi「=11589 pixel x 16384 pixel」でファイルを作成して試しましたが、ご指摘の現象が確認できませんでした。(A0サイズの350dpi までは行けるようです。)
Windowsの基本機能を利用しているため、私では対応できない可能性もありますが、
もしよろしければ、以下数点教えてください。
1. 350dpi → 96dpi とのことですが、縦横のサイズ(mm または、pixel)はいくつでしょうか。
2. 画像の種類(png, jpg, bmp など)は、何を利用されていますか。
3. 利用されているツールは「拡縮率指定版」か「横幅指定版」のどちらをお使いでしょうか。
また、ツールに指定した値はいくつでしょうか。
質問を質問で返してしまい申し訳ありませんが、よろしくお願いします。
お忙しいところ、ご回答ありがとうございます。
1. 7952×5304pixelです。
2. jpg です。
3. どちらも使用してみましたが、同じ結果でした。指定した値はデフォルト値のままです。
ちなみに使用した画像は以下の物です。
https://www.flickr.com/photos/stojaphotography/18734141725/in/dateposted-public/
お時間あれば、右下のマークからダウンロードしてみてください。
ようさん こんばんは。
ご連絡ありがとうございます。了解しました。画像取得しておきます。
試すのは週末になるかもしれません。
遅くとも月曜に見に来てもらえれば何等かの回答は書いておくようにします。
(※ 解決できなかったらごめんなさい。期待せず待っていてください(笑))
ようさん。お待たせしました。現象再現確認できました。
「プロパティー>詳細>水平方向の解像度」が 350dpi → 96 dpi になってしまいますね。
垂直方向の解像度は、350dpi のままであるため サムネイルが潰れててしまいました。
サムネイル表示していなかったため、気づくのに時間がかかってしまいました。
(※ 写真自体を、ペイント等で開いたてもつぶれていなかったため)
それで、原因なのですが、「画像の情報」に問題がある可能性があります。(いくつか試した結果の想像です)
結論は、根本的な解決は「不明」なのですが、今回の問題は対症療法で回避できそうです。
以下、詳細 少し専門的です。
利用したいだけの場合、本文中の「Exif dpi設定版」から落として利用してみてください。
>>>>>>
◆「画像情報に問題」と判断した理由
画像内にある Exif 情報というものが壊れているか、
今利用している Windows の機能で読めない可能性があります。
私はあまり Exif に詳しくないため、正確なことは言えませんが、
そう判断した理由の一つに、Exif の情報を表示・編集する
アプリ(F6 Exif)を利用したところ、ご指定の画像ではエラーとなり開けませんでした。
一度ペイントで開いて保存して、再度 F6 Exif で開くと値が見えるようになりましたが、
その結果として TAGID の 282 (XResolution=画面の幅の解像度) が「無い」か「潰れている」ようです。
ExifのタグID:
http://cachu.xrea.jp/perl/ExifTAG.html
◆解決策
今回の画像の場合は、対症療法なのですが以下をコードに加えると動くと思います。
(以下は、なくなっている XResolution を追加し、 YResolution 値をそろえて変更します)
——————————————————
objIp.Filters.Add(objIp.FilterInfos(“Exif”).FilterID)
objIp.Filters(2).Properties(“ID”).Value = 282
objIp.Filters(2).Properties(“Type”).Value = 1005
objIp.Filters(2).Properties(“Value”).Value = 96
objIp.Filters.Add(objIp.FilterInfos(“Exif”).FilterID)
objIp.Filters(3).Properties(“ID”).Value = 283
objIp.Filters(3).Properties(“Type”).Value = 1005
objIp.Filters(3).Properties(“Value”).Value = 96
——————————————————
Exifに関してはざっくりとしか知識がないため、
ほかにも問題がある & 別の情報も設定したほうが良い可能性が高いですが、
私のほうで検討できたのは、この対症療法な回避策になります。
ご対応ありがとうございます!
新しいコードで試してみようと思います。
本当にありがとうございました。