中山テック 代表の中山です。
さて最近ゲーム系のブログを多く執筆しておりますが、その際のスクショの数が半端ないです。
実はiPhone12のスクショって、パソコン取り込み後にいい感じに大きいサイズで取り込まれるのです。
そこで!(織田裕二風)
「このスクショを幅1200pxに変更できないかなぁ~」というものぐさ思考が働きました(汗
この1200pxは「Google Search Console」のモバイル・ユーザビリティで警告を受けないギリギリのサイズです。
※当社比
そんな今回は今後楽をするためのツールづくりを、勉強兼ねて作成したのでお話したいと思います。
※webpも対応可能!heic版の方使ってください
※変換したheic(webp)のフォルダにjpgが残る仕様は削除⇒henkangoフォルダのみ残る仕様に変更しました
目次
完成品
仕組みの説明の前に「使いたい!」という方向けに完成品のリンクを貼っておきます。
ダウンロードのリンクも乗っているので是非ご活用ください。
HEICファイル未対応バージョン
※ダウンロードはコチラになります
上記リンク押下後、「img-sizechange-heic-kouryo-nashi.vbs」をクリック⇒↓マーク(Download Raw Files)をクリックで完了です。
ダウンロード後は「C:¥」配下に「tmp」とかファイルを作成して入れるといい感じです!
※ユーザ配下やデスクトップに入れると動かない場合もあります。2バイト文字や空白まで考慮する時間なし!(汗
HEICファイル対応バージョン
取り扱い説明書
ツール実行まで
※HEIC考慮なし版「img-sizechange-heic-kouryo-nashi.vbs」を例に取ります
まずVBSファイルをダブルクリックします。
画像ファイル格納場所を聞かれます。
パスを入力します。
対象フォルダの上にあるパスをクリック⇒コピー⇒貼り付けが最も楽な流れかと思います。
変換サイズを入れます(数値のみ、pxと入れるとエラー)。
縦か横いずれか大きい方を入力サイズに変換します(指定サイズ未満の場合は何もしません)。
例えば、横2400の縦1200の画像があった場合は「横1200、縦600」の画像に変換されます。
逆に横1200縦2400の場合は「横600、縦1200」の画像に変換されます。
その後変換作業が行われますが、メッセージが出なければ正常終了となります。
ツール実行後
まず画像ファイルが全て「JPG」形式に変換されます。
※他の形式が良い方はご自身で修正するか、お金頂ければ画像選択版を作成します
そして指定通り横が1200で、縦554と比率を守ったうえで変換完了しました。
HEIC対応版との違い
流れがちょっと違います。
1.HEICファイルをJPGファイルに変換
2.変換後ファイル+HEIC以外のファイルを取得
3.サイズ変換
となり、HEICをJPG化する処理だけが追加されています。
また、先述した通り「ConvertTo-Jpeg.ps1」を同じ場所に入れてます。
このツールは別の方が作ったもので、POWER SHELLで実行しJPG変換しています。
あくまでも変換だけですので、サイズ変更を代表作成ツールで実行している形です。
プログラム解説
画像処理系はライブラリが充実しており、ステップ数も跳ね上がることなくプログラムが組めました。
処理ごとに説明したいと思います。
フォルダの取得
Option Explicit
Const wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
Const cmd = " | .\ConvertTo-Jpeg.ps1"
Dim imgObj '画像オブジェクト
Dim imgFolderName '画像ファイル格納場所名
Dim imgFolderObj '画像ファイル格納場所
Dim imgExt '画像ファイル拡張子
Dim imgKakuchoushiChangeAfter '変更後画像ファイル名
Dim imgKakuchoushiChangeAfterObj '変更後画像ファイルオブジェクト
Dim imgKakuchoushiChangeAfterFolder '変換後画像ファイル格納先
Dim objFS 'ファイルシステムオブジェクト
Dim imgObjOpen 'イメージ(現在)
Dim baseSize '基本サイズ
Dim objImgChange 'イメージ(変換後)
Dim imgName 'ファイル名
Dim runFolder
Set runFolder = CreateObject("Scripting.FileSystemObject")
imgFolderName = InputBox("画像ファイル格納場所を教えて")
'===============================
' ファイルシステムオブジェクト作成
'===============================
Set objFS = CreateObject("Scripting.FileSystemObject")
'===============================
' フォルダ存在確認
'===============================
If objFS.FolderExists(imgFolderName) Then
'===============================
'入力チェック
'===============================
baseSize = CInt(InputBox("変換後サイズを入力。例えば1200pxにしたい場合は1200と入力。\r\n変換は縦横大きい方を基準にして変換します"))
If baseSize <= 0 Then
'入力値なし、または0の場合
Set objFS = Nothing
WScript.Echo "なんかいれて"
WScript.Quit
End If
'===============================
' 存在する場合はフォルダオブジェクト取得
'===============================
Set imgFolderObj = objFS.GetFolder(imgFolderName)
imgKakuchoushiChangeAfterFolder = imgFolderName & "\henkango"
If objFS.FolderExists(imgKakuchoushiChangeAfterFolder) Then
Else
objFS.createFolder(imgKakuchoushiChangeAfterFolder)
End If
まず初めに画像ファイルが格納してあるフォルダパスを指定します。
パスを入力したらそのフォルダが本当に存在しているかを確認します。
※初回なので、変数も記載しております。
ここはオーソドックスな処理が多く、特筆すべき点はないと思います。
HEICの検索とJPG変換
HEICファイルは画像ファイルでなく、ただのバイナリファイルのようです。
オブジェクト生成時の「WIA~」で処理しようとするとエラーが出るのもあり、間違いないですね。
'===============================
' ConvertTo-Jpeg.ps1を使う
'===============================
Dim objWshShell
Set objWshShell = Wscript.CreateObject("WScript.Shell")←①
For Each imgObj In imgFolderObj.Files
imgExt = objFS.GetExtensionName(imgObj.name)
If imgExt = "heic" or imgExt = "HEIC" Then
'WScript.echo runFolder.getParentFolderName(WScript.ScriptFullName) & "\ConvertTo-Jpeg.ps1 " & imgObj
objWshShell.Run "Powershell -ExecutionPolicy Bypass -NoExit " & runFolder.getParentFolderName(WScript.ScriptFullName) & "\ConvertTo-Jpeg.ps1 " & imgObj, 0,false←②
WScript.Sleep 1000 ' heicファイルが重いことを考慮して1秒待つ←③
End If
Next
Set objWshShell = Nothing
WScript.Sleep 3000 ' heicファイル終了まで待つ、余裕持って3秒
①は普段使用しないオブジェクト生成を行いますが、これはPowerShell実行のためのオブジェクトです。
②はPowerShell実行コマンドであり「ConverTo-Jpeg.ps1 対象ファイル 0(プロンプトを出さない), 最後のfalseはコマンド終了を待たないにしてます。
って書いてて気づいたのですが、Trueにしたら③いらないのでは・・・改善の余地ありとしておきます(笑)
③PowerShell終わった後3秒スリープし、後述するファイル取得を確実にします。
各ファイルのサイズ変更
'===============================
' サイズ変更
'===============================
For Each imgObj In imgFolderObj.Files
'===============================
' 拡張子チェック
'===============================
imgExt = objFS.GetExtensionName(imgObj.name)
imgName = imgObj.name
If imgExt = "jpg" or imgExt = "JPG" or imgExt = "jpeg" or imgExt = "JPEG" or imgExt = "png" or imgExt = "PNG" or imgExt = "gif" or imgExt = "TIFF" or imgExt = "tiff" or imgExt = "bmp" Then
'===============================
' イメージファイルオープン
'===============================
Set imgObjOpen = CreateObject("WIA.ImageFile")←①
imgObjOpen.LoadFile(imgObj)
'===============================
' 縦横1200px以上の場合だけ処理
'===============================
If imgObjOpen.Width >= baseSize or imgObjOpen.Height >= baseSize Then
' 変換後のイメージ
'WScript.Echo imgName
Set objImgChange = CreateObject("WIA.ImageProcess")←②
'===============================
' 横か縦、大きい方を1200pxに指定
'===============================
If imgObjOpen.Width >= imgObjOpen.Height Then
'==============================================
' 画像の大きさ指定(1つ目の要素)※横長
'==============================================
objImgChange.Filters.Add(objImgChange.FilterInfos("Scale").FilterID) ' フィルターIDセット←③
objImgChange.Filters(1).Properties("MaximumWidth").Value = baseSize ' 幅
objImgChange.Filters(1).Properties("MaximumHeight").Value = imgObjOpen.Height * (1200/imgObjOpen.Width) ' 高さ
Else
'==============================================
' 画像の大きさ指定(1つ目の要素)※長
'==============================================
objImgChange.Filters.Add(objImgChange.FilterInfos("Scale").FilterID) ' フィルターIDセット
objImgChange.Filters(1).Properties("MaximumWidth").Value = imgObjOpen.Width * (1200/imgObjOpen.Height) ' 幅
objImgChange.Filters(1).Properties("MaximumHeight").Value = baseSize ' 高さ
End If
'==============================================
' コンバート情報
'==============================================
objImgChange.Filters.Add(objImgChange.FilterInfos("Convert").FilterID) ' フィルターIDセット←④
objImgChange.Filters(2).Properties("FormatID").Value = wiaFormatJPEG←⑤
Set imgObjOpen = objImgChange.Apply(imgObjOpen) '
imgObjOpen.SaveFile(objFS.GetAbsolutePathName(imgKakuchoushiChangeAfterFolder & "\" & objFS.getBaseName(imgName) & ".jpg"))
Set objImgChange = Nothing
End If
Set imgObjOpen = Nothing
End If
Next
set imgFolderObj = Nothing
set objWshShell = Nothing
Else
'フォルダが存在しない場合の処理
WScript.Echo "フォルダがねーぞ"
End If
set objFS = Nothing
set runFolder = Nothing
①取得したイメージファイルのオブジェクトを生成
②サイズ変更後用のイメージファイルオブジェクトを生成
③「Scale」指定でサイズ変更が可能です。
④「Convert」でどのファイルにするか指定可能です。
※③④はインデックス1と2を指定しており、様々なオプションを追加できる仕組みになっています
⑤JPG形式にします。FormatIDを「{B96B3CAE-0728-11D3-9D7B-0000F81EF32E} 」で指定するだけ
注意点
ユーザ配下に画像を置かないようにしてほしいです。
理由として、ユーザ名に半角スペースが入って上手く読み込めないためです。
※時間ある時に修正版が出せれば・・・
例えばCドライブ配下に「tmp」といったオリジナルフォルダを作成し、ファイルパスを指定するのがベストです。
まとめ
最近ゲームブログを執筆することが増えたのですが、スクショの数がかなり多くなってます。
中でもペイントツール開いて幅1200(縦1200)と直すのが非常におっくうでした。
特にGoogle Search Consoleのモバイル・ユーザビリティは1200幅を超えると警告出る(当社比)ので、ツールが出来て楽になりました!
使えそうだな、と思ったら是非ダウンロードしてみてください!
最後までご覧頂き、ありがとうございました。