
マイケル
みなさんこんにちは!
マイケルです!

エレキベア
こんにちクマ〜〜

マイケル
この度、当ブログをWordPressからNext.jsへ移行したのですが、
執筆環境もこの上ないものにしたい!
・・・ということで、執筆時に使用するツールをいくつか作ってみました!

マイケル
今回は、その中の 画像リサイズツール について紹介します!

▲作成した画像リサイズツール

▲画像をリサイズ・アップロードできる

エレキベア
おお〜〜〜
よくある画像リサイズを行うツールクマね

マイケル
そう、ブログ記事を書く時に画像サイズを調整して
指定フォルダに出力 するだけのシンプルなツールです!
作ったアプリは下記のGitHubにあげています!
GitHub - electron-image-resizer

エレキベア
今回はElectronを使用して作ったのクマね

マイケル
ブログ移行でNext.jsがだいぶ分かるようになったから、
どうせならツール側もフロントエンド技術で作ってみようと手を出してみたよ!
内容はシンプルだから、まだあまり触ったことがない人でも理解しやすいと思います。

エレキベア
楽しみクマ〜〜〜
ツールの概要と目的
ツールの概要

マイケル
使い方はシンプルで、縦横のサイズをそれぞれ入力して出力ボタンを押下 するだけ!
入力したパスにリサイズされた画像が出力されます。

▲リサイズ後、出力ボタンを押下すると指定パスに保存される

マイケル
リサイズは 縦横比固定、固定無しで指定可能 になっています。
その他、詳細な使い方についてはGitHubのREADMEをご参照ください!

▲入力した値に応じて画像がリサイズされる

エレキベア
これなら簡単に作れそうクマ〜〜
目的

マイケル
ツールを作った目的は、ブログ執筆時の画像リサイズを行いやすくするため です。
Next.jsに移行する前は MarsEdit というツールを使用していたのですが、そちらの画像アップロードに近い形で使用できるよう開発しました。

▲MarsEditに搭載されていた画像アップロード機能が使いやすかった

エレキベア
MarsEditにはお世話になったクマ〜〜
今回作るツールは Win/Mac 共用で使える点もいいクマね
Electron × Vue3での実装

マイケル
それでは早速実装の方を見ていきます。
なおElectron、Vueを使用した環境構築については下記記事にまとめていますので、こちらをご参照ください!

【Electron × Vue3】Electron × Vue3 × TypeScript × Vite でツール開発環境を整える
2023-12-31

エレキベア
Web開発あるあるクマが環境構築は割と手がかかるクマね
メインとなるコード全文

マイケル
今回、処理のメインとなるVueコード全文は下記になります。

エレキベア
Vueはscript、template、styleの順で記述するのだったクマね
ドラッグ&ドロップで画像を表示する

マイケル
ツール挙動としてはまず、ドラッグ&ドロップで画像を表示する仕様でした。

▲画像をドラッグ&ドロップすると表示される

マイケル
この部分の処理を抜き出すと下記のようになります。
@drop.prevent で受け取ったイベントから画像ファイルを読み込んで表示しています。
また、読み込んだ画像については originalImage変数に保持 します。

エレキベア
この辺りはWebでの実装と変わらないクマね
画像リサイズ処理

マイケル
画像のリサイズ処理としては、下記のように数値を入力すると変わる挙動になっています。
縦横比固定のチェックボックスを入れておくと、比率を固定したままリサイズできます。

▲入力した値に応じて画像がリサイズされる

▲「縦横比固定」にチェックボックスを入れておくと比率を維持したままリサイズ可能

マイケル
こちらの処理は下記のようになっています。
canvasに設定してリサイズする手法 を使っていて、下記のQiita記事を参考にさせていただきました。
ブラウザでローカル画像をリサイズしてアップロード - Qiita

エレキベア
canvasでリサイズした画像データをbase64で取得するのクマね

マイケル
シンプルな方法はだけど、GIFアニメーション画像に対応できないのは難点だね
画像ファイル保存処理

マイケル
リサイズした後、出力ボタンを押下することで指定のフォルダに保存することができます。

▲リサイズ後、出力ボタンを押下すると指定パスに保存される

マイケル
こちらの処理は下記のようになっています。
ボタン押下して呼び出しているだけですが、ファイルの保存処理はNode.jsで実行する必要があるためElectronのメインプロセスに記述する必要があります。

マイケル
Electron側の処理は下記のようになっています。
main.tsで設定した処理をpreload.tsを経由して呼び出す形になっていて、
contextBridgeに設定することで、クライアント側からは windowオブジェクトから参照 できるようになります。

エレキベア
メインプロセス側の処理を何もかも実行できるようにしては困るから
必要最低限の処理のみクライアントに公開するクマね

マイケル
あとはクライアント側で下記のようにElectron側のAPIを呼び出すラッパーを作成すれば完成です!
TypeScriptを使用する場合、windowオブジェクトの型を拡張する必要がある点には注意です。

エレキベア
これでメインプロセスとレンダラープロセス間のやり取りはバッチリクマね
入力値等の保存処理

マイケル
最後に、入力した値などを保存する方法についても紹介します。
レンダラープロセスで使用する値のみであれば通常のWebと同様、WebStorageの使用でも問題ないですが、ウィンドウサイズといったメインプロセス側の値は別の方法を使用する必要があります。

マイケル
メインプロセス側の保存処理として electron-store を使用する方法があります。
今回は レンダラープロセス側の値も含めてこちらで保存処理を一括管理 することで進めます。

エレキベア
保存方法がばらけてしまうよりは統一した方がよさそうクマね

マイケル
下記がウィンドウサイズを保存する処理の例になります。
storeオブジェクトを介して保存データのやり取りを行っています。

エレキベア
使い方はシンプルクマね

マイケル
次にレンダラープロセスから保存処理を呼び出すための設定です。
こちらは先ほどと同様、main.ts、preload.tsで公開した関数をElectron側の処理を呼び出すラッパークラスで定義しました。

マイケル
あとはレンダラープロセス側で必要なタイミングで処理を呼び出すようにすれば完了です。
今回は縦横比のチェックボックスと出力パスを保存対象としました。

エレキベア
これで完成クマ〜〜〜〜
おわりに

マイケル
というわけで今回はElectronを使用して簡単なツールを作ってみました!
どうだったかな?

エレキベア
メインプロセスとレンダラープロセスのやり取りは特殊クマが、それ以外はWeb開発と同じ感覚で作れて感動したクマ

マイケル
環境さえ作ってしまえば気軽に作れるから、これからも積極的に活用していきたいね!

マイケル
それでは今日はこの辺で!
アデューー!!

エレキベア
クマ〜〜〜〜〜
【Electron × Vue3】画像をリサイズして任意の場所に保存するツールを作る 〜完〜