<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>画像処理 on AIによる技術記事 備忘録</title><link>https://ai.hack-le.com/tags/%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86/</link><description>Recent content in 画像処理 on AIによる技術記事 備忘録</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Sat, 22 Aug 2026 10:28:04 +0900</lastBuildDate><atom:link href="https://ai.hack-le.com/tags/%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>Pythonで画像をサムネ用に16:9アスペクト比にする空白のパディング追加</title><link>https://ai.hack-le.com/python-padding/</link><pubDate>Fri, 20 Dec 2024 09:03:24 +0900</pubDate><guid>https://ai.hack-le.com/python-padding/</guid><description>&lt;p&gt;この記事では、Pythonを使用して画像にパディングを追加し、指定したアスペクト比（16:9など）に調整するスクリプトの解説を行います。特に、WebP形式で保存するための実用的なコード例を示し、その用途や仕組みを説明します。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="スクリプトの概要"&gt;スクリプトの概要&#10;&lt;/h2&gt;&lt;p&gt;このスクリプトは、以下の目的で使用できます。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;画像のアスペクト比を統一する:&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;画像の幅と高さの比率が異なる場合でも、白いパディングを追加して指定したアスペクト比（例: 16:9）に整えることができます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;WebP形式で保存:&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;処理済みの画像をWebP形式で保存することで、ファイルサイズを小さくしつつ、画質を維持します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;&lt;strong&gt;自動化と簡略化:&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;コマンドライン引数を使用して入力画像と出力画像のパスを指定し、簡単に処理を実行可能です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="ライブラリのインストール"&gt;ライブラリのインストール&#10;&lt;/h2&gt;&lt;p&gt;このスクリプトを実行するためには、以下のライブラリをインストールする必要があります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Pillow&lt;/strong&gt;（Python Imaging Library）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;インストールコマンド:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install pillow&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;Pillowは、Pythonで画像処理を行うためのライブラリで、様々な画像フォーマットの操作をサポートしています。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="スクリプトのコードと解説"&gt;スクリプトのコードと解説&#10;&lt;/h2&gt;&lt;p&gt;以下はスクリプトの全体コードです。部分ごとに詳細を解説します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageOps&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_padding_to_aspect_ratio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 画像を開く&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;original_width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;original_height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 元画像のアスペクト比を計算&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;original_aspect_ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;original_width&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;original_height&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 目標のアスペクト比を計算&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;target_width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target_aspect_ratio&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;target_aspect_ratio_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target_width&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;target_height&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 新しいサイズを計算&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;original_aspect_ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;target_aspect_ratio_value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 横長の場合は高さを合わせる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;new_width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;original_width&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;new_height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original_width&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;target_aspect_ratio_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 縦長の場合は幅を合わせる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;new_height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;original_height&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;new_width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original_height&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;target_aspect_ratio_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 新しいキャンバスのサイズに合わせてパディングを追加&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;new_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;padded_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageOps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;white&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# WebP形式で保存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;padded_image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;WEBP&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;画像を処理しました: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;エラーが発生しました: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;使用法: python add_padding.py 入力画像パス 出力画像パス&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;input_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_image&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;入力ファイルが存在しません: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;input_image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_padding_to_aspect_ratio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h3 id="コードの詳細解説"&gt;コードの詳細解説&#10;&lt;/h3&gt;&lt;h4 id="1-ライブラリのインポート"&gt;1. ライブラリのインポート&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from PIL import Image, ImageOps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import sys&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import os&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Pillow:&lt;/strong&gt; 画像処理を行うためのPythonライブラリ。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;sys:&lt;/strong&gt; コマンドライン引数を扱うために使用。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;os:&lt;/strong&gt; ファイルの存在確認に使用。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="2-関数の定義"&gt;2. 関数の定義&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def add_padding_to_aspect_ratio(image_path, output_path, target_aspect_ratio=(16, 9)):&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;image_path:&lt;/strong&gt; 入力画像のパス。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;output_path:&lt;/strong&gt; 出力画像の保存先。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;target_aspect_ratio:&lt;/strong&gt; タプル形式で目標アスペクト比を指定（デフォルト: 16:9）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="3-画像の読み込みと元サイズの取得"&gt;3. 画像の読み込みと元サイズの取得&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;img = Image.open(image_path)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;original_width, original_height = img.size&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;画像を開いて元の幅と高さを取得します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="4-新しいサイズの計算"&gt;4. 新しいサイズの計算&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if original_aspect_ratio &amp;gt; target_aspect_ratio_value:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; new_width = original_width&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; new_height = int(original_width / target_aspect_ratio_value)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;else:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; new_height = original_height&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; new_width = int(original_height * target_aspect_ratio_value)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;元画像のアスペクト比を計算し、目標アスペクト比に合わせて新しいキャンバスサイズを決定します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="5-パディングの追加"&gt;5. パディングの追加&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;new_size = (new_width, new_height)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padded_image = ImageOps.pad(img, new_size, color=&amp;#34;white&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;ImageOps.pad&lt;/code&gt;を使用して、新しいサイズに合わせたパディングを追加します。&lt;/li&gt;&#10;&lt;li&gt;パディングの色は白（&lt;code&gt;color=&amp;quot;white&amp;quot;&lt;/code&gt;）に設定されています。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="6-webp形式で保存"&gt;6. WebP形式で保存&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padded_image.save(output_path, format=&amp;#34;WEBP&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;処理済み画像をWebP形式で保存します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="7-コマンドライン引数の処理"&gt;7. コマンドライン引数の処理&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if len(sys.argv) != 3:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;使用法: python add_padding.py 入力画像パス 出力画像パス&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sys.exit(1)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;コマンドライン引数が正しく指定されていない場合、エラーメッセージを表示して終了します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="8-入力ファイルの存在確認"&gt;8. 入力ファイルの存在確認&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if not os.path.isfile(input_image):&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(f&amp;#34;入力ファイルが存在しません: {input_image}&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sys.exit(1)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;入力画像が存在しない場合、エラーメッセージを表示して終了します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="使用例"&gt;使用例&#10;&lt;/h2&gt;&lt;h3 id="コマンドラインでの実行"&gt;コマンドラインでの実行&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python add_padding.py sample.jpg output.webp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;sample.jpg&lt;/code&gt;&lt;/strong&gt; : 入力画像。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;output.webp&lt;/code&gt;&lt;/strong&gt; : 出力画像の保存先。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="実行結果"&gt;実行結果&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;入力画像のアスペクト比が目標（16:9）に調整され、白いパディングが追加された画像が&lt;code&gt;output.webp&lt;/code&gt;として保存されます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="応用例と拡張"&gt;応用例と拡張&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;異なるアスペクト比のサポート:&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;(4, 3)&lt;/code&gt;や&lt;code&gt;(1, 1)&lt;/code&gt;など、目標アスペクト比を柔軟に変更可能。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;カスタムパディング色:&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;color=&amp;quot;white&amp;quot;&lt;/code&gt;を変更することで、黒や透明など他の色に対応可能。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;&lt;strong&gt;バッチ処理:&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;複数の画像を一括で処理する機能を追加できます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;このスクリプトは、画像のアスペクト比を簡単に調整し、統一感のあるレイアウトを作成するための便利なツールです。特に、WebP形式で保存することで、効率的なストレージ利用と高速なウェブ表示を実現できます。&lt;/p&gt;&#10;</description></item><item><title>JPGなど画像ファイルを圧縮したCBZ,ZIPファイルをPDFに変換する</title><link>https://ai.hack-le.com/zip-cbz-pdf/</link><pubDate>Wed, 25 Sep 2024 12:50:58 +0900</pubDate><guid>https://ai.hack-le.com/zip-cbz-pdf/</guid><description>&lt;p&gt;電子書籍や漫画のフォーマットとしてよく使われる&lt;code&gt;CBZ&lt;/code&gt;ファイルは、実際にはZIP形式で圧縮されたJPEG画像の集まりです。今回は、この&lt;code&gt;CBZ&lt;/code&gt;ファイルを簡単に&lt;code&gt;PDF&lt;/code&gt;に変換する方法を紹介します。&lt;/p&gt;&#10;&lt;p&gt;手順は非常にシンプルで、無料のコマンドラインツールを使って効率よく変換できます。ぜひ試してみてください。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="必要なツール"&gt;必要なツール&#10;&lt;/h2&gt;&lt;p&gt;以下のツールが必要です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;unzip&lt;/code&gt;（通常のZIPファイル解凍に使います）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;img2pdf&lt;/code&gt;（画像をPDFにまとめるためのツール）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;img2pdf&lt;/code&gt;はPythonベースのツールで、簡単にインストールできます。まだインストールしていない場合、次のコマンドを使用してインストールしましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install img2pdf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="手順"&gt;手順&#10;&lt;/h2&gt;&lt;h3 id="cbzファイルを解凍する"&gt;CBZファイルを解凍する&#10;&lt;/h3&gt;&lt;p&gt;まず、&lt;code&gt;.cbz&lt;/code&gt;ファイルを&lt;code&gt;unzip&lt;/code&gt;コマンドで解凍し、中のJPEG画像を取り出します。次のようにコマンドを実行してください。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip your_file.cbz -d extracted_images&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;your_file.cbz&lt;/code&gt;は変換したいCBZファイルの名前、&lt;code&gt;extracted_images&lt;/code&gt;は画像を解凍するディレクトリです。&lt;/p&gt;&#10;&lt;h3 id="画像をpdfに変換する"&gt;画像をPDFに変換する&#10;&lt;/h3&gt;&lt;p&gt;次に、解凍されたJPEG画像を1つのPDFファイルにまとめます。&lt;code&gt;img2pdf&lt;/code&gt;コマンドを使って、指定したディレクトリ内のJPEG画像をPDF形式に変換します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;img2pdf extracted_images/*.jpg -o output.pdf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、&lt;code&gt;output.pdf&lt;/code&gt;という名前のPDFファイルが作成されます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="スクリプト化"&gt;スクリプト化&#10;&lt;/h2&gt;&lt;p&gt;次のようなBashスクリプトを作成すれば、&lt;code&gt;.cbz&lt;/code&gt;ファイルをPDFに変換し、同じファイル名のPDFを出力し、途中で生成された不要なファイルを削除できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CBZファイルを引数として受け取る&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; filename.cbz&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイル名とディレクトリを分離&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;cbz_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;basename &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cbz_file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; .cbz&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cbz_file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一時ディレクトリを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;temp_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp -d&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CBZファイルを解凍&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cbz_file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$temp_dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 画像ファイルをPDFに変換&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;img2pdf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$temp_dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;/*.jpg -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$directory&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="s2"&gt;.pdf&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一時ディレクトリを削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$temp_dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Conversion completed: &lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="s2"&gt;.pdf&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;以上で、CBZファイルを簡単にPDFに変換できる手順を紹介しました。特別なソフトウェアは必要なく、コマンドラインだけでサクッと変換できるので、ぜひこの方法を活用してください。漫画や電子書籍をPDF化して整理したい方にぴったりの方法です。&lt;/p&gt;&#10;</description></item><item><title>カレントディレクトリ以下のすべてのpng,jpgをwebpに変換するシェルスクリプト</title><link>https://ai.hack-le.com/pngjpg-webp/</link><pubDate>Mon, 25 Mar 2024 16:23:39 +0900</pubDate><guid>https://ai.hack-le.com/pngjpg-webp/</guid><description>&lt;p&gt;&lt;strong&gt;この記事の目的は、シェルスクリプトでカレントディレクトリ以下にあるjpgやpngといった画像ファイルを、すべてwebpに変換する&lt;/strong&gt;ことです。サブディレクトリ内のデータも含みます。また、高速化のために並列処理をします。&lt;/p&gt;&#10;&lt;p&gt;実行環境&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Machine: M2 Pro Mac mini (2023)&lt;/li&gt;&#10;&lt;li&gt;macOS Sonoma 14.3.1&lt;/li&gt;&#10;&lt;li&gt;GNU bash 5.2.26&lt;/li&gt;&#10;&lt;li&gt;ImageMagick 7.1.1-29&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="スクリプトの提示"&gt;スクリプトの提示&#10;&lt;/h2&gt;&lt;p&gt;以下に、この自動化された並列処理を実行するためのbashスクリプトを示します。このスクリプトは、指定したディレクトリ以下の画像ファイル（PNG、JPG、JPEG）を検索し、それらをwebpフォーマットに変換後、元のファイルを削除します。変換プロセスは並列で実行されるため、作業の完了にかかる時間が大幅に短縮されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;convert_image&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;img&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;basename &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; .&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;img&lt;/span&gt;&lt;span class="p"&gt;##*.&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;new_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;.webp&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; convert &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$new_path&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; -f convert_image&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find . -type f &lt;span class="se"&gt;\(&lt;/span&gt; -iname &lt;span class="se"&gt;\*&lt;/span&gt;.png -o -iname &lt;span class="se"&gt;\*&lt;/span&gt;.jpg -o -iname &lt;span class="se"&gt;\*&lt;/span&gt;.jpeg &lt;span class="se"&gt;\)&lt;/span&gt; -print0 &lt;span class="p"&gt;|&lt;/span&gt; parallel -0 convert_image&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このスクリプトは、すべてのPNG、JPG、およびJPEGファイルを現在のディレクトリおよびそのサブディレクトリから検索し、それぞれをwebpフォーマットに変換した後、元のファイルを削除します。この自動化されたプロセスにより、手動で行う場合と比べて大幅な時間短縮が可能になります。&lt;/p&gt;&#10;&lt;h2 id="スクリプトの実行方法"&gt;スクリプトの実行方法&#10;&lt;/h2&gt;&lt;p&gt;このセクションでは、前述のbashスクリプトを実行するために必要な環境設定と、スクリプトの具体的な使用方法について詳しく説明します。スクリプトを効果的に活用するには、いくつかの前提条件を満たし、適切な手順で実行することが重要です。&lt;/p&gt;&#10;&lt;p&gt;前提条件は以下です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;ImageMagickのインストール&lt;/strong&gt;: このスクリプトは&lt;code&gt;convert&lt;/code&gt;コマンドを使用して画像をwebpフォーマットに変換します。&lt;code&gt;convert&lt;/code&gt;コマンドは、ImageMagickソフトウェアスイートの一部です。ImageMagickは多くのLinuxディストリビューション、macOS、およびWindowsで利用可能です。お使いのシステムにImageMagickがインストールされていない場合は、公式の&lt;a class="link" href="https://imagemagick.org/script/download.php" target="_blank" rel="noopener"&#10; &gt;ImageMagickダウンロードページ&lt;/a&gt;からインストールすることができます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;GNU parallelのインストール&lt;/strong&gt;: このスクリプトはGNU parallelを使用して、画像変換プロセスを並列で実行します。これにより、複数の画像を同時に処理することができ、全体の処理時間が大幅に短縮されます。GNU parallelはLinuxディストリビューションのパッケージマネージャーや&lt;a class="link" href="https://www.gnu.org/software/parallel/" target="_blank" rel="noopener"&#10; &gt;GNU parallelの公式ページ&lt;/a&gt;を通じてインストールできます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="スクリプトの主要部分解説"&gt;スクリプトの主要部分解説&#10;&lt;/h2&gt;&lt;p&gt;このセクションでは、先に紹介したbashスクリプトの構成要素を詳しく説明し、各部分がどのように機能するかを解説します。スクリプトは大きく分けて三つの主要な処理ステップによって構成されています。画像ファイルの検索、画像の並列変換、および元の画像ファイルの削除です。&lt;/p&gt;&#10;&lt;h3 id="1-画像ファイルの検索"&gt;1. 画像ファイルの検索&#10;&lt;/h3&gt;&lt;p&gt;スクリプトは&lt;code&gt;find&lt;/code&gt;コマンドを使用して、指定したディレクトリ以下のすべてのPNG、JPG、JPEGファイルを検索します。この検索は再帰的に行われ、サブディレクトリ内のファイルも対象となります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find . -type f &lt;span class="se"&gt;\(&lt;/span&gt; -iname &lt;span class="se"&gt;\*&lt;/span&gt;.png -o -iname &lt;span class="se"&gt;\*&lt;/span&gt;.jpg -o -iname &lt;span class="se"&gt;\*&lt;/span&gt;.jpeg &lt;span class="se"&gt;\)&lt;/span&gt; -print0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;.&lt;/code&gt;は現在のディレクトリを表します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-type f&lt;/code&gt;はファイルタイプが「ファイル」であるものを検索対象とします。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-iname&lt;/code&gt;は大文字小文字を区別せずに名前が一致するファイルを検索します。ここでは、&lt;code&gt;.png&lt;/code&gt;、&lt;code&gt;.jpg&lt;/code&gt;、&lt;code&gt;.jpeg&lt;/code&gt;の各拡張子を持つファイルを対象としています。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-print0&lt;/code&gt;は検索結果をNULL文字で区切って出力します。これは&lt;code&gt;parallel&lt;/code&gt;コマンドでの処理に必要です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-画像の並列変換"&gt;2. 画像の並列変換&#10;&lt;/h3&gt;&lt;p&gt;検索した画像ファイルは&lt;code&gt;parallel&lt;/code&gt;コマンドを通じて並列に処理されます。このステップでは、各画像ファイルがwebpフォーマットに変換されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;parallel -0 convert_image&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-0&lt;/code&gt;オプションは、入力がNULL文字で区切られていることを&lt;code&gt;parallel&lt;/code&gt;に指示します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;convert_image&lt;/code&gt;は画像を変換するために定義された関数です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;GNU parallelは、複数のプロセスを並列で実行するための強力なツールです。このスクリプトでは、&lt;code&gt;parallel&lt;/code&gt;コマンドを用いて、検索された各画像ファイルに対して&lt;code&gt;convert_image&lt;/code&gt;関数を同時に実行させています。これにより、画像の変換タスクがCPUの複数のコアに分散され、タスクの完了速度が向上します。&lt;/p&gt;&#10;&lt;h3 id="3-画像変換関数-convert_image"&gt;3. 画像変換関数 &lt;code&gt;convert_image&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;この関数は、個々の画像ファイルをwebpフォーマットに変換し、成功したら元のファイルを削除します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;convert_image&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;img&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;basename &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; .&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;img&lt;/span&gt;&lt;span class="p"&gt;##*.&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;new_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="s2"&gt;.webp&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; convert &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$new_path&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;img=&amp;quot;$1&amp;quot;&lt;/code&gt;は関数に渡された最初の引数（ここでは画像ファイルのパス）を変数&lt;code&gt;img&lt;/code&gt;に代入します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;basename&lt;/code&gt;と&lt;code&gt;dirname&lt;/code&gt;コマンドを使用して、ファイル名（拡張子なし）とディレクトリのパスを取得します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;convert&lt;/code&gt;コマンドは画像をwebpフォーマットに変換します。変換が成功した場合（&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;の後）、&lt;code&gt;rm&lt;/code&gt;コマンドによって元のファイルが削除されます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;このスクリプトによって、大量の画像ファイルを効率的にwebpフォーマットに変換するプロセスが自動化されます。並列処理の採用により、この変換作業を大幅に高速化することができます。&lt;/p&gt;&#10;&lt;h2 id="トラブルシューティング"&gt;トラブルシューティング&#10;&lt;/h2&gt;&lt;p&gt;実際にスクリプトを使用する際には、いくつかの一般的な問題に遭遇する可能性があります。このセクションでは、最も一般的な問題とその解決策をいくつか紹介します。&lt;/p&gt;&#10;&lt;h3 id="1-gnu-parallelが見つからない"&gt;1. GNU parallelが見つからない&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;問題&lt;/strong&gt;: スクリプトを実行しようとすると、「parallel: command not found」というエラーメッセージが表示されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;解決策&lt;/strong&gt;:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;GNU parallelがインストールされているかどうかを確認してください。インストールされていない場合は、お使いのシステムのパッケージマネージャーを使用してインストールします。例えば、Ubuntuでは&lt;code&gt;sudo apt-get install parallel&lt;/code&gt;を実行します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-imagemagickのconvertコマンドが機能しない"&gt;2. ImageMagickのconvertコマンドが機能しない&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;問題&lt;/strong&gt;: &lt;code&gt;convert&lt;/code&gt;コマンドを実行しようとするとエラーが発生するか、期待される出力が得られない。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;解決策&lt;/strong&gt;:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ImageMagickが正しくインストールされているかを確認してください。インストールされていない、またはバージョンが古い場合は、最新版を公式ウェブサイトからダウンロードしてインストールします。&lt;/li&gt;&#10;&lt;li&gt;特にMac OSの場合、ImageMagickの最新バージョンでは&lt;code&gt;convert&lt;/code&gt;コマンドが&lt;code&gt;magick convert&lt;/code&gt;に置き換えられている可能性があります。その場合は、スクリプト内の&lt;code&gt;convert&lt;/code&gt;コマンドを&lt;code&gt;magick convert&lt;/code&gt;に変更してください。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="3-スクリプトが特定の画像ファイルを見つけられない"&gt;3. スクリプトが特定の画像ファイルを見つけられない&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;問題&lt;/strong&gt;: スクリプトを実行しても、一部の画像ファイルが処理されない。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;解決策&lt;/strong&gt;:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;find&lt;/code&gt;コマンドのパターンが正しいか確認してください。大文字小文字の違いが原因でファイルが見落とされることがあります。&lt;code&gt;-iname&lt;/code&gt;オプションは大文字小文字を区別しないため、これを使用していることを確認してください。&lt;/li&gt;&#10;&lt;li&gt;スクリプトが実行されているディレクトリと、処理したい画像ファイルが格納されているディレクトリが一致しているかを確認してください。必要に応じて、&lt;code&gt;find&lt;/code&gt;コマンドの検索パスを調整します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="参考資料"&gt;参考資料&#10;&lt;/h2&gt;&lt;p&gt;この記事では、大量の画像ファイルを効率的にwebp形式に変換し、そのプロセスを並列で実行するbashスクリプトの作成と使用について詳しく説明しました。このスクリプトを使用することで、画像処理タスクの時間を大幅に短縮し、ウェブサイトのパフォーマンスを向上させることができます。また、GNU parallelとImageMagickを活用することで、マルチコアプロセッサの能力を最大限に引き出し、作業の効率を向上させる方法も紹介しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://www.gnu.org/software/parallel/" target="_blank" rel="noopener"&#10; &gt;GNU Parallel Official Documentation&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://imagemagick.org/index.php" target="_blank" rel="noopener"&#10; &gt;ImageMagick Official Documentation&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>サブディレクトリ下の画像ファイルをwebp形式に変換するシェルスクリプト</title><link>https://ai.hack-le.com/sub-directory-image-webp/</link><pubDate>Sun, 24 Sep 2023 15:38:27 +0900</pubDate><guid>https://ai.hack-le.com/sub-directory-image-webp/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&#10;&lt;/h2&gt;&lt;p&gt;この記事では、サブディレクトリに存在する&lt;code&gt;.PNG&lt;/code&gt;, &lt;code&gt;.png&lt;/code&gt;, &lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.jpeg&lt;/code&gt;, &lt;code&gt;.JPG&lt;/code&gt;, &lt;code&gt;.JPEG&lt;/code&gt; ファイルを&lt;code&gt;.webp&lt;/code&gt;形式に変換し、元の画像ファイルを削除するスクリプトを、BashとFishシェルでそれぞれ実装する方法について説明します。&lt;/p&gt;&#10;&lt;h2 id="必要なツール"&gt;必要なツール&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;ImageMagick (convert コマンドが使用されます)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="fishのスクリプト"&gt;Fishのスクリプト&#10;&lt;/h2&gt;&lt;h3 id="コード"&gt;コード&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; img in /*.PNG /*.png /*.jpg /*.jpeg /*.JPG /*.JPEG&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;set&lt;/span&gt; name &lt;span class="o"&gt;(&lt;/span&gt;basename &lt;span class="nv"&gt;$img&lt;/span&gt; .&lt;span class="o"&gt;(&lt;/span&gt;string split -r -m1 &lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;2&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;set&lt;/span&gt; dir &lt;span class="o"&gt;(&lt;/span&gt;dirname &lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;set&lt;/span&gt; new_path &lt;span class="nv"&gt;$dir&lt;/span&gt;/&lt;span class="nv"&gt;$name&lt;/span&gt;.webp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; convert &lt;span class="nv"&gt;$img&lt;/span&gt; &lt;span class="nv"&gt;$new_path&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm &lt;span class="nv"&gt;$img&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ワンライナー"&gt;ワンライナー&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; img in /*.PNG /*.png /*.jpg /*.jpeg /*.JPG /*.JPEG&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; name &lt;span class="o"&gt;(&lt;/span&gt;basename &lt;span class="nv"&gt;$img&lt;/span&gt; .&lt;span class="o"&gt;(&lt;/span&gt;string split -r -m1 &lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;2&lt;span class="o"&gt;])&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; dir &lt;span class="o"&gt;(&lt;/span&gt;dirname &lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; new_path &lt;span class="nv"&gt;$dir&lt;/span&gt;/&lt;span class="nv"&gt;$name&lt;/span&gt;.webp&lt;span class="p"&gt;;&lt;/span&gt; convert &lt;span class="nv"&gt;$img&lt;/span&gt; &lt;span class="nv"&gt;$new_path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; rm &lt;span class="nv"&gt;$img&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bashのスクリプト"&gt;Bashのスクリプト&#10;&lt;/h2&gt;&lt;h3 id="コード-1"&gt;コード&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find . -type f &lt;span class="se"&gt;\(&lt;/span&gt; -iname &lt;span class="s1"&gt;&amp;#39;*.png&amp;#39;&lt;/span&gt; -o -iname &lt;span class="s1"&gt;&amp;#39;*.jpg&amp;#39;&lt;/span&gt; -o -iname &lt;span class="s1"&gt;&amp;#39;*.jpeg&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\)&lt;/span&gt; -exec sh -c &lt;span class="s1"&gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; f=&amp;#34;{}&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; d=$(dirname &amp;#34;$f&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; b=$(basename &amp;#34;$f&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; nf=&amp;#34;${d}/$(basename &amp;#34;${b%.*}&amp;#34;).webp&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; convert &amp;#34;$f&amp;#34; &amp;#34;$nf&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; rm &amp;#34;$f&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ワンライナー-1"&gt;ワンライナー&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find . -type f &lt;span class="se"&gt;\(&lt;/span&gt; -iname &lt;span class="s1"&gt;&amp;#39;*.png&amp;#39;&lt;/span&gt; -o -iname &lt;span class="s1"&gt;&amp;#39;*.jpg&amp;#39;&lt;/span&gt; -o -iname &lt;span class="s1"&gt;&amp;#39;*.jpeg&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\)&lt;/span&gt; -exec sh -c &lt;span class="s1"&gt;&amp;#39;f=&amp;#34;{}&amp;#34;; d=$(dirname &amp;#34;$f&amp;#34;); b=$(basename &amp;#34;$f&amp;#34;); nf=&amp;#34;${d}/$(basename &amp;#34;${b%.*}&amp;#34;).webp&amp;#34;; convert &amp;#34;$f&amp;#34; &amp;#34;$nf&amp;#34;; rm &amp;#34;$f&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;以上がBashとFishで&lt;code&gt;.PNG&lt;/code&gt;, &lt;code&gt;.png&lt;/code&gt;, &lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.jpeg&lt;/code&gt;, &lt;code&gt;.JPG&lt;/code&gt;, &lt;code&gt;.JPEG&lt;/code&gt; ファイルを&lt;code&gt;.webp&lt;/code&gt;に変換するスクリプトの書き方です。これにより、簡単に画像ファイルの形式を変更することができます。&lt;/p&gt;&#10;</description></item><item><title>fish,bashでのPNGとJPGファイルのWebPへの一括変換</title><link>https://ai.hack-le.com/fishbash-png-jpg-webp/</link><pubDate>Wed, 26 Jul 2023 14:28:43 +0900</pubDate><guid>https://ai.hack-le.com/fishbash-png-jpg-webp/</guid><description>&lt;p&gt;単純な内容だけれどよく使うかつよく忘れるので。これ、本当はBardに書かせようと思っていたんだよね。でも、Bardはfishスクリプトだと言っているのにBashのスクリプトしか書いてくれなかった。あと日本語も通じづらくて、かなり明確に指示してやる必要がある。結論として、ChatGPT-4にはまだ及ばないなぁ、と。アホになっているという噂のChatGPT-4だが、それでも今出ているAIチャットでは一番なんじゃないだろうか。&lt;/p&gt;&#10;&lt;p&gt;ということで、記事を書かせた。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;こんにちは、皆さん。&lt;/p&gt;&#10;&lt;p&gt;今日はLinuxシェルを使ってカレントディレクトリのPNGとJPGファイルを一括でWebP形式に変換する方法についてご紹介します。この作業は、fish shellとbashの両方で実行可能です。Macのターミナルや、Windows上のWSL2でももちろん実行可能です。&lt;/p&gt;&#10;&lt;p&gt;前提条件として、この記事で用いる&lt;code&gt;convert&lt;/code&gt;コマンドはImageMagickの一部なので、事前にシステムにインストールしておく必要があります。&lt;/p&gt;&#10;&lt;h2 id="fish-shellでの変換"&gt;Fish Shellでの変換&#10;&lt;/h2&gt;&lt;p&gt;まず、Fish Shellを使った方法から見ていきましょう。以下のワンライナーを実行すると、カレントディレクトリの全ての&lt;code&gt;.png&lt;/code&gt;と&lt;code&gt;.jpg&lt;/code&gt;ファイルが&lt;code&gt;.webp&lt;/code&gt;に変換されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; file in *.png *.jpg&lt;span class="p"&gt;;&lt;/span&gt; convert &lt;span class="nv"&gt;$file&lt;/span&gt; -format webp &lt;span class="o"&gt;(&lt;/span&gt;basename -s &lt;span class="o"&gt;(&lt;/span&gt;string match -r &lt;span class="s2"&gt;&amp;#34;\..+&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.webp&lt;span class="p"&gt;;&lt;/span&gt; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドは、まず&lt;code&gt;*.png *.jpg&lt;/code&gt;というパターンで全てのPNGとJPGファイルを選択します。そして、&lt;code&gt;convert&lt;/code&gt;コマンド（ImageMagickの一部として提供されている）を使ってそれぞれのファイルを&lt;code&gt;.webp&lt;/code&gt;フォーマットに変換します。&lt;/p&gt;&#10;&lt;h2 id="bashでの変換"&gt;Bashでの変換&#10;&lt;/h2&gt;&lt;p&gt;次に、Bashを使った方法を見ていきましょう。以下のワンライナーを実行すると、同様にカレントディレクトリの全ての&lt;code&gt;.png&lt;/code&gt;と&lt;code&gt;.jpg&lt;/code&gt;ファイルが&lt;code&gt;.webp&lt;/code&gt;に変換されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; file in *.&lt;span class="o"&gt;{&lt;/span&gt;png,jpg&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; convert &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -format webp &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.webp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドでは、&lt;code&gt;*.{png,jpg}&lt;/code&gt;というパターンマッチングを使用して.pngと.jpgファイルを一度に全て選択します。そして、&lt;code&gt;&amp;quot;${file%.*}.webp&amp;quot;&lt;/code&gt;という表現を用いて元のファイル名から拡張子を取り除き、新しい&lt;code&gt;.webp&lt;/code&gt;拡張子を追加します。&lt;/p&gt;&#10;&lt;h2 id="結論"&gt;結論&#10;&lt;/h2&gt;&lt;p&gt;以上が、Fish ShellとBashを使ってPNGとJPGファイルをWebPに一括変換する方法です。このようなスクリプトは、特に大量の画像ファイルを効率的に変換したいときに非常に便利です。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;実家のような安心感。なんだかんだでChatGPT-4パイセンが今のところナンバーワンですわ……。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;fishでカレントディレクトリのすべてのpngをwebpにconvertするワンライナ&lt;/li&gt;&#10;&lt;li&gt;いいね。pngだけではなくjpgについてもやりたい時は？&lt;/li&gt;&#10;&lt;li&gt;ありがとう。 ここまでの内容を、ブログの記事としてまとめてください。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;質問の数もシンプル。&lt;/p&gt;&#10;</description></item><item><title>【Macユーザー必見】右クリックから画像をwebpに瞬時に変換しよう！</title><link>https://ai.hack-le.com/mac-webp/</link><pubDate>Sun, 16 Jul 2023 14:13:24 +0900</pubDate><guid>https://ai.hack-le.com/mac-webp/</guid><description>&lt;p&gt;内容はタイトルのとおりで、クイックアクションを使ってwebpに変換するコマンドを作成するというもの。要はこれを作る。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://ai.hack-le.com/images/uploads/2023/07/a468cf58e75fa2612957a0d6740ebdf5.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;これは普通に便利だよ。では以下、ChatGPT-4によるテンション高めの記事本文。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;こんにちは、今日はMacの便利な機能であるクイックアクションを使って、画像をwebp形式に変換する方法をご紹介します。この方法を使えば、画像ファイルを右クリックするだけで簡単にwebp形式に変換することができます。&lt;/p&gt;&#10;&lt;p&gt;手順は以下の通りです。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&#10;&lt;/h2&gt;&lt;p&gt;今回の作業のための準備をしましょう。いくつかのツールを入れる必要があります。&lt;/p&gt;&#10;&lt;h3 id="homebrewのインストール"&gt;Homebrewのインストール&#10;&lt;/h3&gt;&lt;p&gt;まずはHomebrewをインストールします。HomebrewはMacでソフトウェアを簡単に管理するためのパッケージ管理システムです。既にインストールしてある方はこの手順をスキップしてください。ターミナルを開き、以下のコマンドを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/bin/bash -c &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="libwebpのインストール"&gt;libwebpのインストール&#10;&lt;/h3&gt;&lt;p&gt;次に、Homebrewを使ってlibwebpをインストールします。libwebpはGoogleが開発した画像形式であるwebpへの変換ツールです。ターミナルで以下のコマンドを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install webp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="クイックアクションの作成"&gt;クイックアクションの作成&#10;&lt;/h2&gt;&lt;p&gt;Automatorを開き、「新規ドキュメント」を作成します。「ドキュメントの種類」の選択画面が表示されたら、「クイックアクション」を選択します。選択したら、下記のような設定をしますので、手順を説明します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://ai.hack-le.com/images/uploads/2023/07/7374f7834a56835f276a2c2bcaba8f00.jpg"&gt;&lt;/p&gt;&#10;&lt;p&gt;「ワークフローが受け取る現在の項目」の項目で「イメージファイル」を選択し、さらにその右隣の「検索対象」のドロップダウンから「Finder」を選択します。&lt;/p&gt;&#10;&lt;p&gt;左側のパネルから「ユーティリティ」カテゴリを開き、「シェルスクリプトを実行」を右側の空白領域にドラッグアンドドロップします。&lt;/p&gt;&#10;&lt;p&gt;シェルスクリプトアクションに以下のコマンドを入力します（「入力の引き渡し方法」は「引数として」に設定）。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; f in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /usr/local/bin/cwebp &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.webp&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;著者注記: あらかじめ &lt;code&gt;which cwebp&lt;/code&gt; でcwebpのパスを調べておく。 &lt;code&gt;/opt/homebrew/bin/cwebp&lt;/code&gt;にする必要があるかも。&lt;/p&gt;&#10;&lt;h2 id="クイックアクションの実行"&gt;クイックアクションの実行&#10;&lt;/h2&gt;&lt;p&gt;メニューバーの「ファイル」から「保存」を選び、クイックアクションに名前をつけて保存します。この名前がコマンドの名前になるため、「webpに変換」などのわかりやすい名前にしましょう。&lt;/p&gt;&#10;&lt;p&gt;これで準備は完了です。Finderから画像ファイルを右クリックすると、コンテクストメニューの「クイックアクション」の中に新しく作成したアクションが表示されます。選択すると、選択した画像ファイルがwebp形式に変換され、元の画像と同じ場所に保存されます。&lt;/p&gt;&#10;&lt;h2 id="注意点画質と元画像の削除について"&gt;注意点、画質と元画像の削除について&#10;&lt;/h2&gt;&lt;h3 id="元画像の削除"&gt;元画像の削除&#10;&lt;/h3&gt;&lt;p&gt;注意点として、このコマンドは元の画像ファイルを保持しつつ新しいwebpファイルを作成します。元の画像を削除したい場合は、上記のシェルスクリプトに&lt;code&gt;rm &amp;quot;$f&amp;quot;&lt;/code&gt;コマンドを追加します。これにより、変換後のwebpファイルが作成された後に元の画像が削除されます。&lt;/p&gt;&#10;&lt;p&gt;以下に修正したコードを示します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; f in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /usr/local/bin/cwebp &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.webp&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードは元のファイルを完全に削除するため、誤って重要なファイルを削除しないように十分注意してください。実行前にバックアップを取るなど、データの安全対策を忘れずに行ってください。&lt;/p&gt;&#10;&lt;h3 id="画像の品質"&gt;画像の品質&#10;&lt;/h3&gt;&lt;p&gt;また、出力されるwebp画像の品質はデフォルトの設定（75％）になります。品質設定を変更するには、上記のcwebpコマンドに-qオプションを追加します（例：-q 90）。&lt;/p&gt;&#10;&lt;p&gt;以上で、Macのクイックアクションを使って画像を簡単にwebpに変換する方法のご紹介を終えます。ぜひ試してみてください。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;有能。シェルスクリプトを交えつつAutomatorを使った完全なガイド。これはGoogle検索だと中々出てこない。&lt;/p&gt;&#10;&lt;p&gt;以下のような質問をした。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Macのクイックアクションで、画像をwebpに変換するアクションを作成したい！&lt;/li&gt;&#10;&lt;li&gt;素晴らしい。完璧だ。UIは日本語のほうがよかったが、そこは僕が補足しよう。 クイックアクションで画像ファイルを右クリックから手軽にwebpに変換できるようにする方法について、ブログ記事としてまとめてくれ&lt;/li&gt;&#10;&lt;li&gt;元の画像を削除したい場合のコードについても書いたほうがいいな。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;解説のUIが思いっきり英語だったので、僕のほうで直すといったところ、なんだか日本語化しようと頑張っていたが、結果間違っていたのでそこは僕が修正した。相変わらずディテールを間違えるChatGPT。こうして人間の仕事は微調整になっていくのか……。&lt;/p&gt;&#10;</description></item><item><title>WSL2のUbuntuでPNGをWebPに変換する</title><link>https://ai.hack-le.com/wsl-png-web/</link><pubDate>Fri, 14 Jul 2023 00:11:50 +0900</pubDate><guid>https://ai.hack-le.com/wsl-png-web/</guid><description>&lt;p&gt;WSL2でImageMagickを使ってpngをwebpにしようとしたところ、エラーが出た。ChatGPT-4に聞いたところ、即座に適切な答えが返ってきて感動した。&lt;/p&gt;&#10;&lt;p&gt;なのでそれを記事にしてもらったところ、pngをwebpに変換するという、エラー対応よりも汎用的な記事になった。エラーメッセージも本文中にあるし、こちらのほうが記事としてもよさそう。やるなChatGPT。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;本記事では、Windows Subsystem for Linux (WSL2) 上の Ubuntu 環境で PNG 画像を WebP 形式に変換する方法を説明します。このプロセスは、ImageMagick の &lt;code&gt;convert&lt;/code&gt; コマンドと Google の &lt;code&gt;cwebp&lt;/code&gt; ツールを使用します。&lt;/p&gt;&#10;&lt;h2 id="必要なツールのインストール"&gt;必要なツールのインストール&#10;&lt;/h2&gt;&lt;p&gt;まずは必要なツールをインストールしましょう。今回は、画像変換ツールの ImageMagick と WebP エンコーダの &lt;code&gt;cwebp&lt;/code&gt; を使用します。&lt;/p&gt;&#10;&lt;p&gt;ImageMagick は以下のコマンドでインストールできます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install imagemagick&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、WebP エンコーダの &lt;code&gt;cwebp&lt;/code&gt; をインストールします。&lt;code&gt;cwebp&lt;/code&gt; は libwebp パッケージの一部として提供されています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install webp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで必要なツールのインストールは完了です。&lt;/p&gt;&#10;&lt;h2 id="画像の変換"&gt;画像の変換&#10;&lt;/h2&gt;&lt;p&gt;画像の変換は非常に簡単です。以下のように &lt;code&gt;convert&lt;/code&gt; コマンドを使用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;convert input.png output.webp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで &lt;code&gt;input.png&lt;/code&gt; は変換したい PNG 画像のパス、&lt;code&gt;output.webp&lt;/code&gt; は出力する WebP 画像のパスを指定します。&lt;/p&gt;&#10;&lt;p&gt;ただし、これを初めて実行すると、次のようなエラーが出ることがあります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;convert-im6.q16: delegate failed `&amp;#39;cwebp&amp;#39; -quiet %Q &amp;#39;%i&amp;#39; -o &amp;#39;%o&amp;#39;&amp;#39; @ error/delegate.c/InvokeDelegate/1919.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このエラーは、&lt;code&gt;convert&lt;/code&gt; コマンドが &lt;code&gt;cwebp&lt;/code&gt; ツールを使おうとしたが見つからなかったために発生します。これは通常、&lt;code&gt;cwebp&lt;/code&gt; がシステムにインストールされていないか、パスが正しく設定されていないことを意味します。この問題は前述の手順で &lt;code&gt;cwebp&lt;/code&gt; をインストールすることで解決します。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;今回は、WSL2 の Ubuntu 環境で PNG 画像を WebP 形式に変換する方法を見てきました。必要なツールのインストールから、実際の画像変換、そして一般的なエラーの解決方法までを網羅しました。これにより、あなたのシステムでも WebP 画像の生成が可能になり、WebP の圧縮効率と品質の良さを最大限に活用することができます。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;速攻で解決して感動した。以下質問。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;convertコマンドでpngをwebpに変換しようとしたら、エラーが出た。 convert-im6.q16: delegate failed `&amp;lsquo;cwebp&amp;rsquo; -quiet %Q &amp;lsquo;%i&amp;rsquo; -o &amp;lsquo;%o&amp;rsquo;&amp;rsquo; @ error/delegate.c/InvokeDelegate/1919.&lt;/li&gt;&#10;&lt;li&gt;WSL2のUbuntuで実行したところ、うまくいったよ。ありがとう。 備忘録のために、ここまでのことを、ブログの記事としてまとめてください。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;質問まったくしていない。&lt;/p&gt;&#10;&lt;p&gt;単一質問のシンプルなもので、ChatGPTが即座に答えてくれるうえに、コマンドなので誰でも評価できる以上、ブログ記事にする意味はあるのか？という疑義はあるが、自分の備忘録も兼ねているので。常にChatGPTが使える状況でもないし、ChatGPTもどうなるかわからないし。&lt;/p&gt;&#10;</description></item><item><title>WordPressにおける画像リサイズの抑制</title><link>https://ai.hack-le.com/wordpress-image-resize/</link><pubDate>Wed, 28 Jun 2023 23:57:16 +0900</pubDate><guid>https://ai.hack-le.com/wordpress-image-resize/</guid><description>&lt;p&gt;このサイトはWordPressで構築している。WordPressではメディアをアップロードすると、複数のサイズのものが自動的に生成される。これは主にパフォーマンスのためだ。なのだが、サイトの性質によってはストレージ容量を圧迫するデメリットのほうが大きいと判断される場合もある。&lt;/p&gt;&#10;&lt;p&gt;ということで、自動リサイズを抑制するにはどうしたらよいか、ChatGPT-4に聞いた。&lt;/p&gt;&#10;&lt;h2 id="イントロ"&gt;イントロ&#10;&lt;/h2&gt;&lt;p&gt;WordPressでは、画像をアップロードすると自動的に複数のサイズが生成されます。これはテーマやプラグインがそれぞれ異なるサイズの画像を必要とするためであり、また、レスポンシブデザインを適用するためにも必要です。しかし、これらの自動生成される画像は、一部のユーザーにとっては不必要なディスク容量を占有する可能性があります。&lt;/p&gt;&#10;&lt;h2 id="抑制する方法"&gt;抑制する方法&#10;&lt;/h2&gt;&lt;p&gt;WordPressの画像生成を抑制する方法はいくつかあります：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Media Settingsを調整する&lt;/strong&gt;: WordPressの「Settings」-&amp;gt;「Media」から各画像サイズを0pxに設定すると、WordPressはそのサイズの画像を生成しなくなります。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;プラグインを使用する&lt;/strong&gt;: 「Stop Generating Unnecessary Thumbnails」や「Disable Media Sizes」のようなプラグインを利用すると、自動生成される画像のサイズを制御できます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;functions.phpにコードを追加する&lt;/strong&gt;: テーマのfunctions.phpファイルに特定のコードを追加すると、特定の画像サイズの生成を停止できます。ただし、これには開発者スキルが必要であり、テーマの更新時に変更が上書きされる可能性もあります。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;しかし、これらの手法を適用する際には注意が必要です。特に、現在使用しているテーマやプラグインが特定の画像サイズを必要としている場合や、レスポンシブデザインを適切に機能させるためには、これらの自動生成される画像が必要な場合があります。&lt;/p&gt;&#10;&lt;p&gt;特に、WordPress 4.4以降で追加された「medium_large」サイズは、メディア設定からは設定できませんが、これはモバイルやタブレットなどのデバイスでの表示性能を向上させるために重要です。このサイズを無効にすると、一部のデバイスでの読み込み速度が低下する可能性があります。&lt;/p&gt;&#10;&lt;h2 id="未検証-medium_large-を生成しない方法"&gt;(未検証) medium_large を生成しない方法&#10;&lt;/h2&gt;&lt;p&gt;もし「medium_large」サイズの画像も生成しないようにしたい場合は、先ほどご紹介したfunctions.phpへのコード追加の方法を利用すると良いでしょう。以下のコードをあなたのテーマのfunctions.phpファイルに追加すれば、「medium_large」サイズの画像の生成を停止できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add_action( &amp;#39;init&amp;#39;, &amp;#39;remove_plugin_image_sizes&amp;#39; );&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;function remove_plugin_image_sizes() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; remove_image_size( &amp;#39;medium_large&amp;#39; );&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、これを行うと、一部のレスポンシブデザインの要素がうまく機能しなくなる可能性があるので、注意してください。&lt;/p&gt;&#10;&lt;h2 id="wordpressで画像のサイズを確認する方法"&gt;WordPressで画像のサイズを確認する方法&#10;&lt;/h2&gt;&lt;p&gt;WordPressが自動的に生成した画像のサイズを確認するには、主に以下の2つの方法があります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;FTPクライアントまたはcPanelのファイルマネージャを使用する&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;FTPクライアント（FileZillaなど）またはcPanelのファイルマネージャを使用して、サーバー上のWordPressインストールフォルダにアクセスします。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;wp-content/uploads&lt;/code&gt;ディレクトリに移動します。このディレクトリには、アップロードされたすべてのメディアファイルが保存されています。&lt;/li&gt;&#10;&lt;li&gt;年と月ごとにフォルダが分けられています。新しく画像をアップロードしたら、対応する年と月のフォルダに移動します。&lt;/li&gt;&#10;&lt;li&gt;アップロードした画像のバリエーションを見ることができます。もし設定した通りに特定のサイズの画像が生成されていなければ、それは成功している証拠です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;WordPressのメディアライブラリから確認する&lt;/strong&gt;:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;WordPressのダッシュボードにアクセスして、「メディア」-&amp;gt;「ライブラリ」に移動します。&lt;/li&gt;&#10;&lt;li&gt;アップロードした画像をクリックし、「編集」を選択します。&lt;/li&gt;&#10;&lt;li&gt;「ファイル URL」フィールドを見ると、画像のバリエーションが表示されます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;どちらの方法も手動で確認する方法ですが、直接サーバー上のファイルを調べる方がより確実です。&lt;/p&gt;&#10;&lt;h2 id="まとめ"&gt;まとめ&#10;&lt;/h2&gt;&lt;p&gt;WordPressでの画像サイズ生成は、ディスク容量と表示性能のトレードオフを考慮する必要があります。そのバランスは、サイトの内容、訪問者のデバイスの種類、ホスティング環境などによります。ディスク容量を節約することは重要ですが、それがユーザ体験の悪化を引き起こすならば、ある程度のディスク容量の増加を受け入れることが合理的な選択と言えるでしょう。&lt;/p&gt;&#10;&lt;h2 id="寸評"&gt;寸評&#10;&lt;/h2&gt;&lt;p&gt;これは僕が実際にChatGPTに相談して、かつその挙動を確認したものだ。したがって内容に嘘はないはず。&lt;/p&gt;&#10;&lt;p&gt;結論として、僕はlarge sizeのみ抑制するようにした。というのも、メインであげる画像のsizeがlarge sizeと近かったからである。small sizeとmedium sizeについては、なくても僕の使うテーマでは挙動に問題は見られなかったものの、元画像の1/10程度まで容量が圧縮されるので、たとえ作られても全体の影響はさほどでもないと考えた。一方で、large sizeについては、元画像とあまり変わりがない。なくてもテーマには影響がなかったし、あまり意味がないと考えた。これによって、3割程度の容量を節約できる見込みだ。&lt;/p&gt;&#10;&lt;p&gt;ということで、このやりとりはけっこう僕にとって有意義だった。このまとめは、他のユーザにとっても有意義ではなかろうか。以下に質問を書く。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;WordPressでは画像を上げると自動的に複数のサイズでリサイズされて保存されますが、それによる容量がもったいないです。抑制することはできますか。&lt;/li&gt;&#10;&lt;li&gt;メディアの設定による方法がもっとも簡単そうですね。それを実行するにあたって、注意すべきことはありますか。&lt;/li&gt;&#10;&lt;li&gt;複数のサイズが生成されていないことを実際に確認するには、どうしたらいいですか&lt;/li&gt;&#10;&lt;li&gt;調べてみたところ、オリジナルサイズ以外に4つのサイズができていたものが、1つまで減っていました。 設定画面ではサムネイルサイズ、ミディアムサイズ、ラージサイズの3つについて設定できました。 どうやら、メディア画面からは残り1つのサイズについては制御できないようですね。&lt;/li&gt;&#10;&lt;li&gt;なるほど。 しかしメディア画面で設定できないようにしているのには、理由があるかもしれません。 また、functions.phpの改修は、今後のメンテナンスを考えるとできれば避けたいところです。 容量が1.5倍ほどになってしまうのは少し痛いですが、これくらいは受容すべきかもしれません。&lt;/li&gt;&#10;&lt;li&gt;ここまでの議論を、記事にまとめてください。&lt;/li&gt;&#10;&lt;li&gt;確認方法についても、以下にまとめてください。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;確認方法をスキップするのは非常によろしくなかったが、指摘すれば書いてくれる。&lt;/p&gt;&#10;</description></item></channel></rss>