{"componentChunkName":"component---src-templates-post-template-jsx","path":"/blog/posts/gatsby-microcms-imgix","result":{"data":{"microcmsPosts":{"title":"GatsbyとmicroCMSブログ、Imgixの画像処理をする。","updatedAtJP":"2021/05/22","updatedAt":"2021-05-22T09:45:43.196Z","link":"gatsby-microcms-imgix","article":"<h2 id=\"hc1efff6596\">こまったこと</h2><p><br>microCMSでは、gatsby-plugin-imageに対応していないため<br>graphqlで画像データが渡ってこず、URLだけ渡ってくる仕様。<br>どうやって画像の最適化をしようかな<br></p><h2 id=\"h9843b72c3d\">microCMS運営さんにチャットで問い合わせ</h2><p><br>チャットで問い合わせをしました。</p><blockquote>いつもお世話になります。 GatsbyとmicroCMSでブログを作ろうとしています。 gatsby-plugin-imageで&gt;microCMSの画像を扱いたいのですが、graphqlのデータを見ると、urlとwidthとheightしかわたってきてい&gt;ないので、扱うことができません。 なにかやり方があるかご教示お願いしたいです</blockquote><p><img src=\"https://images.microcms-assets.io/assets/a20dd30d3f4d43d8814295dae8cee134/2c2c481e7d3049dc924ac292d51e5e91/sekatsky-O0Ac7NVuTns-unsplash.jpg\" alt=\"\"><br>ご丁寧に対応いただき、次のことがわかりました。</p><ul><li>ImgixというCDNを通して、APIを利用するとよい</li></ul><p><br>あとから考えれば、ドキュメントなどをしっかり読めばわかりそうなことでした😅<br></p><h2 id=\"h37da129d09\">[Imgix](https://www.imgix.com/)を使って画像を最適化</h2><p><br></p><h3 id=\"hbaeea5ce71\">[Imgix](https://www.imgix.com/)とは</h3><p><br>公式サイトより<br></p><blockquote>Powerful image processing, simple API<br>imgix transforms, optimizes, and intelligently caches your entire image library for fast websites and apps using simple and robust URL parameters.</blockquote><p><br></p><blockquote>強力な画像処理、シンプルなAPI<br>imgixは、シンプルで堅牢なURLパラメーターを使用して、高速なWebサイトやアプリ用に画像ライブラリ全体を変換、最適化、およびインテリジェントにキャッシュします。&nbsp;</blockquote><p><br>microCMSの画像タイプのコンテンツは基本的にこのCDNを通ってくるということなので<br>ここのAPIでできることが基本的にできるということです。<br><br>や<a href=\"https://docs.imgix.com/apis/rendering\" target=\"_blank\" rel=\"noopener noreferrer\">Rendering API</a> を使うとできそう。<br><br>画像URLの最後に`?`をつけて、その後にいろいろなパラメータを付けることで、画像に対していろいろな処理ができます。<br>例えば<br></p><pre><code>https://&lt;graphqlで渡ってきた画像のurl&gt;?w=200</code></pre><p><br><br>とすると、画像の幅を２００（ｐｘ？）に設定できます。<br>その後ろに`&amp;`でつなげれば、複数のパラメータを付けることができます。<br><br>いろいろオートの設定もありました。<br>例えば<br>1. 画像の圧縮　<code>auto=compress</code><br>基本的には７５％。`q=`で圧縮率を指定することもできます。<br>2. フォーマット選択`<code>auto=format</code><br>対応しているブラウザなら、自動でwebp形式に変換してくれる。<br>3. 画像のトリミング　<code>ar=2:1&amp;fit=crop&amp;fp-y=0.5</code><br>アスペクト比と中心を決めてトリミングできます。切り抜いた部分以外はデータとしても削除。（残す設定もできる）<br><br>とりあえず、今回のプロジェクトでは、<br>この３つを設定することにしました。<br><br>ブログの記事ごとのアイキャッチ画像に対して<br>これらの加工をして、<br>各記事ページタイトルのバックにおくことにしました。<br><br>### 実装したコード<br></p><h4 id=\"hd0d61fb32a\">各記事のテンプレートファイル post-template.js</h4><pre><code>&lt;MicroCmsImage\t\t\t\t\t\t\t\t\t&nbsp;\n&nbsp;url={data.microcmsPosts.eye_catch.url}\t\t\t\t\t\t\t\t\t&nbsp;\n&nbsp;compress=\"auto=compress\"\t\t\t\t\t\t\t\t\t&nbsp;\n&nbsp;format=\"auto=format\"\t\t\t\t\t\t\t\t\t&nbsp;\n&nbsp;ar=\"ar=2:1&amp;fit=crop&amp;fp-y=0.5\"\n/&gt;</code></pre><p><br></p><h4 id=\"h0e82c7cb9e\">画像をレンダリングするコンポーネント　microcmsimage.js</h4><p><br></p><pre><code>import React from \"react\"\nimport styled from \"styled-components\"\nexport default function MicroCmsImg(props) {\n\n&nbsp;// imgタグを親要素に対して幅いっぱいに表示する\n&nbsp;const ImgWrapper = styled.img`\n&nbsp;&nbsp;width: 100%;\n&nbsp;`\n\n&nbsp;const { url } = props // 画像のURL\n&nbsp;// url以外のパラメータを１つの文字列型変数にセット\n&nbsp;let array = Object.values(props)\n&nbsp;let param = \"\"\n&nbsp;array.map(function (elem) {\n\n&nbsp;// propsの最初はurlなのでそれは入れない\n&nbsp;&nbsp;if (array.indexOf(elem) !== 0) {\n&nbsp;&nbsp;&nbsp;//最初の要素は?をつける\n&nbsp;&nbsp;&nbsp;if (array.indexOf(elem) == 1) {\n&nbsp;&nbsp;&nbsp;&nbsp;param = `?${elem}`\n&nbsp;&nbsp;&nbsp;} else {\n&nbsp;&nbsp;&nbsp;&nbsp;param = `${param}&amp;${a}`\n&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;}\n&nbsp;})\n\n&nbsp;return (\n&nbsp;&nbsp;&lt;&gt;\n// imgのsrcにurlとparamをつなげたものをセット\n&nbsp;&nbsp;&nbsp;&lt;ImgWrapper src={url + param} alt=\"\" /&gt;\n&nbsp;&nbsp;&lt;/&gt;\n&nbsp;)}</code></pre><p><br></p><h2 id=\"h34f9d72ef7\">Imgixではもっといろいろできます。</h2><p>例えば、画像にフィルターをかけることもできます。<br>モザイク加工したり、blur効果つけたり。<br>顔認識でそこにクローズアップとか。<br>文字入れたり、ノイズリダクションに回転。<br><br>gatsbyプロジェクトでは、<br>対応していればgatsby-plugin-imageが使えますが、<br>そうでないプロジェクトなら、<br>これを使うのもいいかもしれません。<br><br><br><br><br></p>","author":"そんほんす","eye_catch":null,"category":{"category":"技術","categorySlug":"tech"}}},"pageContext":{"id":"6d703df2-29d0-5319-b8a7-122dfde3f486","previous":{"title":"まずは１つ目の記事","link":"first-article"},"next":{"title":"２つ目の記事です","link":"second"}}},"staticQueryHashes":["1550610083","2560007497","3020873570"]}