CINXE.COM
コピペOK! SVGフィルターを使った画像加工の作例集 - ICS MEDIA
<!DOCTYPE html><html lang="ja" dir="ltr" data-capo=""><head><meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=yes"> <title>コピペOK! SVGフィルターを使った画像加工の作例集 - ICS MEDIA</title> <script src="https://cdn.ampproject.org/v0.js" async></script> <script src="https://cdn.ampproject.org/v0/amp-twitter-0.1.js" async custom-element="amp-twitter"></script> <script src="https://cdn.ampproject.org/v0/amp-youtube-0.1.js" async custom-element="amp-youtube"></script> <style>.ripple{overflow:hidden;position:relative}.ripple-effect{animation-name:ripple;background:#888;border-radius:50%;display:block;opacity:.2;pointer-events:none;position:absolute;transform:scale(0);-webkit-user-select:none;user-select:none;will-change:opacity,transform}.ripple[data-ripple=light] .ripple-effect{background:#fff!important}.ripple[data-ripple=dark] .ripple-effect{background:#000!important}@keyframes ripple{to{opacity:0;transform:scale(2)}}</style> <style>.btn{background-color:initial;border:1px solid #0000;border-radius:.25rem;color:#000;display:inline-block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;user-select:none}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}button:focus{outline:5px auto var(--primary)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child,.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-primary{background-color:var(--primary);color:#fff!important}@media (any-hover:hover){@supports (background-color:color-mix(in srgb,#000,#000)){.btn-primary:hover{background-color:color-mix(in srgb,var(--primary),#000 20%)}}}.btn-secondary{background-color:var(--color-btn-secondary)}@media (prefers-color-scheme:dark){.btn-secondary{color:var(--color-text-p)}}@media (any-hover:hover){@supports (background-color:color-mix(in srgb,#000,#000)){.btn-secondary:hover{background-color:color-mix(in srgb,var(--color-btn-secondary),#888 20%)}}}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-primary:not(:disabled,.disabled).active:focus,.btn-primary:not(:disabled,.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #268fff80}.text-center{text-align:center!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.badge{accent-color:red;border-radius:.25rem;display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .4em;text-align:center;transition:color .2s,background-color .2s,border-color .2s;vertical-align:initial;white-space:nowrap}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-light{background-color:var(--color-btn-secondary);color:var(--color-text-p)}.badge-primary{background-color:var(--primary);color:#fff}@media (prefers-reduced-motion:reduce){*,:after,:before{animation:none!important;transition:none!important}}html{scroll-padding-top:32px;touch-action:manipulation}body{accent-color:var(--primary);line-break:strict;margin:0;overflow-wrap:anywhere;padding:0;word-break:normal}body ::selection{background-color:rgba(50,35,179,.251)}@media (prefers-color-scheme:dark){body ::selection{background-color:rgba(126,112,254,.251)}}img{vertical-align:bottom}a{color:inherit;-webkit-text-decoration:none;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,.2)}@media (prefers-color-scheme:dark){a{-webkit-tap-highlight-color:rgba(255,255,255,.1)}}ul{padding:0}ul li{list-style:none}button{appearance:none;border:none;cursor:pointer}</style> <style>.language-glsl,.language-html,.language-js{background:var(--color-bg-code);color:#383a42;display:block;overflow-x:auto;padding:.5em}.hljs-comment,.hljs-quote{color:#666}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#813b32}.hljs-literal{color:#005c7d}.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{color:#2f612f}.hljs-built_in,.hljs-class .hljs-title{color:#733801}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#7f5901}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#3060bf}.hljs-strong{font-weight:700}.hljs-link{-webkit-text-decoration:underline;text-decoration:underline}</style> <style>@media (prefers-color-scheme:dark){.language-glsl,.language-html,.language-js{background:var(--color-bg-code);color:#abb2bf;display:block;overflow-x:auto;padding:.5em}.hljs-comment,.hljs-quote{color:#5c6370}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{color:#98c379}.hljs-built_in,.hljs-class .hljs-title{color:#e6c07b}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}.hljs-strong{font-weight:700}.hljs-link{-webkit-text-decoration:underline;text-decoration:underline}}</style> <style>:root{--color-text-p:#404040;--color-text-p-secondary:#606060;--color-text-h:#202020;--color-bg:#eff2f5;--color-bg-code:#fff;--color-bg-footer:#f9f9f9;--color-bg-strong:#fff996;--color-bg-btn:#1976d2;--color-btn-secondary:#e0e0e0;--color-text-a:#1976d2;--color-text-a-hover:var(--primary);--color-text-a-visited:var(--color-text-a);--color-border:#0000001a;--primary:#3223b3;--font-sans:Helvetica Neue,Arial,Hiragino Sans,Hiragino Kaku Gothic ProN,BIZ UDPGothic,Meiryo,sans-serif;--font-mono:SFMono-Regular,Menlo,Consolas,Bitstream Vera Sans Mono,Courier New,Courier,BIZ UDGothic,Meiryo,monospace}@media (prefers-color-scheme:dark){:root{--color-text-p:#d0d0d0;--color-text-p-secondary:#a0a0a0;--color-text-h:#fff;--color-bg:#202020;--color-bg-code:#282c34;--color-bg-footer:#090909;--color-bg-strong:#7a0099;--color-text-a:#90caf9;--color-border:#d6d6d61a;--color-btn-secondary:#404040;--primary:#7e70fe}}@supports (-webkit-touch-callout:none) and (font:-apple-system-body){:root{font:-apple-system-body}}body{background-color:var(--color-bg);font-family:var(--font-sans)}iframe{border:none}.btn-primary{background-color:var(--primary);border-color:var(--primary);color:#fff}@media (min-width:768px){br.mobile{display:none}}@media (min-width:992px){br.tablet{display:none}}</style> <style>.ly-top-header[data-v-53af800e]{background-color:var(--color-bg);width:100%;z-index:1}@media print{.ly-top-header[data-v-53af800e]{position:static}}</style> <style>.mediaHeader[data-v-c016e82a]{border-bottom:1px solid var(--color-border);overflow:hidden;width:100%}.mediaHeader-row[data-v-c016e82a]{height:48px;margin:0 auto;max-width:960px;position:relative}@media (min-width:1200px){.mediaHeader-row[data-v-c016e82a]{max-width:1080px}}.mediaHeader-row h1[data-v-c016e82a]{left:50%;margin:0;position:absolute;top:50%;transform:translate(-50%,-50%)}.mediaHeader-row-tool[data-v-c016e82a]{align-items:center;display:flex;position:absolute;right:0;top:50%;transform:translateY(-50%)}.mediaHeader-row-tool a[data-v-c016e82a]{border-radius:6px;box-sizing:initial;color:var(--color-text-p);display:block;height:32px;padding:3px;-webkit-text-decoration:none;text-decoration:none;transition:background .2s}@media (any-hover:hover){.mediaHeader-row-tool a[data-v-c016e82a]:hover{background:#8080804d}}.mediaHeader-row-tool a[data-v-c016e82a]:active{background:#80808080}.mediaHeader-row-tool svg[data-v-c016e82a]{background:#0000;fill:#333}@media (prefers-color-scheme:dark){.mediaHeader-row-tool svg[data-v-c016e82a]{fill:#ccc}}.mediaHeader-row-tool-item[data-v-c016e82a]{margin-left:.5rem}</style> <style>a[data-v-39193113]{align-items:center;background-image:url(/_nuxt/logo-website.Cz5k_taM.png);background-position:50%;background-repeat:no-repeat;background-size:contain;display:flex;height:48px;width:144px}span[data-v-39193113]{visibility:hidden}</style> <style>nav[data-v-5ddcd2fd]{width:100%}.category-list[data-v-5ddcd2fd]{display:flex;justify-content:space-between;margin:0 auto;max-width:960px}@media (min-width:1200px){.category-list[data-v-5ddcd2fd]{max-width:1080px}}@media (max-width:767.98px){.category-list[data-v-5ddcd2fd]{overflow:auto}.category-list[data-v-5ddcd2fd]::-webkit-scrollbar{height:2px}.category-list[data-v-5ddcd2fd]::-webkit-scrollbar-track{border-radius:0}.category-list[data-v-5ddcd2fd]::-webkit-scrollbar-thumb{background-color:#80808080}}.category-list-item[data-v-5ddcd2fd]{flex:1}.category-list-item a[data-v-5ddcd2fd]{color:var(--color-text-p);display:block;font-feature-settings:"palt";font-size:.75rem;font-weight:700;padding:.5rem 1rem;text-align:center;-webkit-text-decoration:none;text-decoration:none;transition:color .2s,background .2s;-webkit-user-select:none;user-select:none;white-space:nowrap;word-break:keep-all}@media (any-hover:hover){.category-list-item a[data-v-5ddcd2fd]:hover{background:var(--primary);color:#fff}}.category-list-item a._current[data-v-5ddcd2fd],.category-list-item a[aria-current=page][data-v-5ddcd2fd]{background:var(--primary);color:#fff}@media (max-width:767.98px){.category-list-item a[data-v-5ddcd2fd]{font-size:.625rem;padding-left:.5rem;padding-right:.5rem}}</style> <style>.heroSpace[data-v-cb0dd5fc]{background:#000;height:256px;overflow:hidden;position:relative;width:100%}.heroSpace-title[data-v-cb0dd5fc]{align-items:center;color:#fff;display:flex;font-weight:400;height:100%;justify-content:center;position:absolute;text-align:center;width:100%}.heroSpace-title p[data-v-cb0dd5fc]{color:#fff;font-feature-settings:"palt";font-size:1rem;font-weight:400;letter-spacing:.01em;margin:0 auto 16px;max-width:1080px}@media (max-width:767.98px){.heroSpace-title p[data-v-cb0dd5fc]{padding-left:16px;padding-right:16px}}.heroSpace-title h1[data-v-cb0dd5fc]{font-feature-settings:"palt";font-size:2rem;font-weight:400;letter-spacing:2px;margin:0 auto;max-width:1080px}@media (max-width:767.98px){.heroSpace-title h1[data-v-cb0dd5fc]{font-size:1.5rem;padding-left:16px;padding-right:16px}}.heroSpace_padding[data-v-cb0dd5fc]{height:326px}@media (max-width:767.98px){.heroSpace_padding[data-v-cb0dd5fc]{height:212px}}.heroSpace_padding .heroSpace-title[data-v-cb0dd5fc]{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.heroSpace iframe[data-v-cb0dd5fc]{height:100%;position:absolute;width:100%}</style> <style>.wbr[data-v-92dd477a]{display:inline-block}</style> <style>.top_link[data-v-da421125]{margin-bottom:64px;text-align:center}.entry-column[data-v-da421125]{display:flex;margin:0 auto;max-width:960px;width:100%}</style> <style>.site_updater[data-v-63cb43db]{background:var(--color-bg-footer);bottom:0;margin-top:20px;position:sticky}.site_updater p[data-v-63cb43db]{margin:0;padding:10px 0;text-align:center}.site_info[data-v-63cb43db]{background:var(--color-bg-footer);color:var(--color-text-p);padding:32px 0}@media (max-width:1199.98px){.site_info[data-v-63cb43db]{padding:32px 16px}}.site_info-sections[data-v-63cb43db]{display:grid;gap:32px;grid-template-columns:repeat(3,1fr);margin:0 auto;max-width:960px;width:100%}@media (max-width:991.98px){.site_info-sections[data-v-63cb43db]{gap:16px}}@media (max-width:767.98px){.site_info-sections[data-v-63cb43db]{grid-template-columns:1fr}}@media (min-width:1200px){.site_info-sections[data-v-63cb43db]{max-width:1080px}}.site_info-sections_item h3[data-v-63cb43db]{color:var(--color-text-h);font-size:1.5rem;font-weight:400;line-height:1;margin-bottom:16px}.site_info-sections_item p[data-v-63cb43db]{color:var(--color-text-p-secondary);font-size:.75rem;line-height:1.75;text-align:justify}.site_info-sections_item ul[data-v-63cb43db]{list-style-position:inside;padding:0 0 0 1rem}.site_info-sections_item ul li[data-v-63cb43db]{font-size:.75rem;line-height:1.75;list-style:circle}.site_info-sections_item a[data-v-63cb43db]{color:var(--color-text-p-secondary);-webkit-text-decoration:none;text-decoration:none;transition:color .2s}@media (any-hover:hover){.site_info-sections_item a[data-v-63cb43db]:hover{color:var(--color-text-a-hover)}}</style> <style>.copyright[data-v-4b34f398]{font-size:1rem;margin-top:32px;text-align:center}@media (min-width:768px){.copyright br.mobile[data-v-4b34f398]{display:none}}.raw-pages[data-v-4b34f398]{display:flex;font-size:.875rem;gap:24px;justify-content:center;margin-bottom:16px;margin-top:16px}@media (max-width:767.98px){.raw-pages[data-v-4b34f398]{flex-direction:column;gap:4px}}.raw-pages a[data-v-4b34f398]{color:var(--color-text-p-secondary);transition:color .2s}@media (any-hover:hover){.raw-pages a[data-v-4b34f398]:hover{color:var(--color-text-a-hover)}}</style> <style>.eyecatch[data-v-921b35f7]{overflow:hidden;position:relative}.eyecatch .eyecatch-blur-container[data-v-921b35f7]{height:100%;overflow:hidden;position:absolute;width:100%}.eyecatch .eyecatch-blur[data-v-921b35f7]{background-size:cover;content:"";filter:brightness(1.25) blur(64px);height:150%;left:-25%;position:absolute;top:-25%;width:150%}@media (max-width:991.98px){.eyecatch .eyecatch-blur[data-v-921b35f7]{display:none}}.eyecatch-inner[data-v-921b35f7]{margin:0 auto;position:relative}@media (min-width:1200px){.eyecatch-inner[data-v-921b35f7]{max-width:1080px}}@media (min-width:992px) and (max-width:1199.98px){.eyecatch-inner[data-v-921b35f7]{max-width:960px}}.eyecatch-inner-img[data-v-921b35f7]{view-transition-name:var(--0e97d286);aspect-ratio:1280/512;contain:paint;height:auto;object-fit:cover;width:100%}@media (max-width:767.98px){.eyecatch-inner-img[data-v-921b35f7]{aspect-ratio:1280/720}}</style> <style>@media (min-width:992px){.entry[data-v-49d92408]{display:flex;flex-direction:row;gap:32px;margin:0 auto}}.entry-article[data-v-49d92408]{margin:0 auto;max-width:720px}@media (min-width:992px) and (max-width:1199.98px){.entry-article[data-v-49d92408]{width:640px}}.entry-sidebar[data-v-49d92408]{flex:1}@media (max-width:991.98px){.entry-sidebar[data-v-49d92408]{display:none}}</style> <style>@charset "UTF-8";.article-date{color:var(--color-text-p-secondary);font-size:.8rem;margin:1rem 0;text-align:center}@media (max-width:767.98px){.article-date{padding:0 1rem}}.article-date a{color:currentcolor;-webkit-text-decoration:none;text-decoration:none;transition:color .2s}@media (any-hover:hover){.article-date a:hover{color:var(--color-text-a-hover)}}.article-date .article-date-slash{margin-left:.25rem;margin-right:.25rem}.article-tag{display:flex;flex-wrap:wrap;gap:8px 4px;justify-content:center;list-style:none;padding:0}.article-tag li{display:inline-block}.article-tag a{border:1px solid var(--color-text-p);border-radius:6px;color:var(--color-text-p);font-size:.75rem;padding:.2em .5em;-webkit-text-decoration:none;text-decoration:none;transition:color .2s,border .2s}@media (any-hover:hover){.article-tag a:hover{border:1px solid var(--color-text-a-hover);color:var(--color-text-a-hover);-webkit-text-decoration:none;text-decoration:none}}.article{color:var(--color-text-p);font-size:1rem;line-break:strict;line-height:200%;overflow-wrap:anywhere;word-break:normal}.article h3{color:var(--color-text-h);font-family:var(--font-sans);font-feature-settings:"palt";font-size:2rem;font-weight:400;letter-spacing:.025em;line-height:1.25;margin-bottom:.5em;margin-top:3em}@media (max-width:767.98px){.article h3{font-size:1.5rem}}.article h3:after{background-color:var(--color-border);content:"";display:block;height:1px;margin-top:.25rem}.article h4,.article h5{color:var(--color-text-h);font-family:var(--font-sans);font-feature-settings:"palt";font-weight:400;letter-spacing:.025em;margin-bottom:1em;margin-top:2em}.article h4{font-size:1.5rem}.article h5{font-size:1.25rem}.article h1,.article h6{background:red;color:#000}.article h1:before,.article h6:before{content:"(この見出しレベルはサポートされてません)"}.article p{text-align:left;word-break:normal}.article p small{color:var(--color-text-p-secondary);font-size:.75em}.article p>a>img,.article p>img{height:auto;max-width:100%}@media (max-width:767.98px){.article p>a>img,.article p>img{margin-left:-1rem;margin-right:-1rem;max-width:none;width:100vw}.article p amp-youtube{margin-left:-1rem;margin-right:-1rem;max-width:100vw}}.article strong{background:linear-gradient(#0000 61%,var(--color-bg-strong) 0,var(--color-bg-strong) 0);font-weight:700}.article code{background-color:var(--color-bg-code);border-radius:.25rem;color:var(--color-text-p);font-family:var(--font-mono);padding:.2rem .4rem}@media (max-width:767.98px){.article{padding:0 1rem}}.article a{color:var(--color-text-a);-webkit-text-decoration:none;text-decoration:none}@media (any-hover:hover){.article a:hover{color:var(--color-text-a);-webkit-text-decoration:underline;text-decoration:underline}}.article a:visited{color:var(--color-text-a-visited)}.article a[target=_blank]:after{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiMxOTc2ZDJ9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTI0LjU1IDB2M2gxMC4zM0wxNC40NCAyMy40NGwyLjEyIDIuMTJMMzcgNS4xMnYxMC4zNGgzVjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMzAgMzdIM1YxMGgxMVY3SDB2MzNoMzNWMjZoLTN6IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=");background-repeat:no-repeat;content:"";display:inline-block;height:.7rem;margin:0 .25rem;width:.7rem}.article ol,.article ul{padding-inline-start:32px}.article li{list-style:inherit}.article>section>iframe{aspect-ratio:16/9;height:auto;width:100%}@media (max-width:767.98px){.article>section>iframe{margin-left:-1rem;margin-right:-1rem;max-width:none;width:100vw}}.article kbd{background-color:var(--color-bg-code);border-radius:4px;color:inherit;font-family:var(--font-mono);padding:.2rem .4rem;white-space:nowrap}.article blockquote{background:var(--color-bg-code);border-radius:6px;color:var(--color-text-p);margin:0;padding:1em}.article blockquote p{margin:0}.article pre{color:var(--color-text-p);font-family:var(--font-mono);font-size:.9rem;line-height:150%;overflow:auto;word-break:break-all;word-wrap:break-word;background:var(--color-bg-code);border-radius:5px}@media (max-width:767.98px){.article pre{font-size:.8rem;margin-left:-1rem;margin-right:-1rem}}.article code.hljs,.article pre>code{box-sizing:border-box;display:block;padding:20px;position:relative}.article code.hljs:before{background:var(--color-text-p);color:var(--color-bg);display:inline;font-size:.5rem;left:20px;line-height:1.25;padding:0 1em;position:absolute;top:0;-webkit-user-select:none;user-select:none}.article code.hljs.language-javascript:before,.article code.hljs.language-js:before{content:"JS"}.article code.hljs.language-json:before{content:"JSON"}.article code.hljs.language-xml:before{content:"XML"}.article code.hljs.language-html:before{content:"HTML"}.article code.hljs.language-css:before{content:"CSS"}.article code.hljs.language-scss:before{content:"SCSS"}.article code.hljs.language-ts:before,.article code.hljs.language-typescript:before{content:"TypeScript"}.article code.hljs.language-actionscript:before{content:"ActionScript 3.0"}.article code.hljs.language-cs:before{content:"C#"}.article code.hljs.language-bash:before{content:"コマンドライン"}.article code.hljs.language-swift:before{content:"Swift"}.article code.hljs.language-glsl:before{content:"GLSL"}.article code.hljs.language-vue:before{content:"Vue"}.breadcrumb{margin:5rem auto 1rem;max-width:1080px}@media (max-width:1199.98px){.breadcrumb{margin:0 1rem}}.breadcrumb ul{display:block;font-size:.9rem;list-style:none;overflow:hidden;padding:0;width:100%}.breadcrumb li{display:inline;word-break:break-all}.breadcrumb li:before{content:"/";margin:0 .5rem}.breadcrumb li:first-child:before{content:none}.breadcrumb li a{color:var(--color-text-p);-webkit-text-decoration:none;text-decoration:none}.breadcrumb li a:visited{color:currentcolor}@media (any-hover:hover){.breadcrumb li a:hover{color:var(--color-text-a-hover)}}.wrap{overflow:hidden}@media (min-width:768px){.wrap{margin:0 auto;max-width:720px}}.wrap_960{margin:0 auto}@media (min-width:1200px){.wrap_960{max-width:1080px}}@media (min-width:992px) and (max-width:1199.98px){.wrap_960{max-width:960px}}footer #copyright{font-size:.75rem;text-align:center}hr{border-color:var(--color-text-p);border-style:inset;border-width:1px;display:block;margin-block:.5em;margin-inline:auto;opacity:.5;overflow:hidden;unicode-bidi:isolate}table{font-size:.9rem;line-height:1.5;width:100%;word-break:break-all}table td,table th{border-top:1px solid var(--color-border);padding:.5rem .25rem;vertical-align:top}table thead th{border-bottom:1px solid var(--color-border);vertical-align:bottom}</style> <style>h2.article_title[data-v-3469d367]{color:var(--color-text-h);font-family:var(--font-sans);font-feature-settings:"palt";font-size:2rem;font-weight:700;letter-spacing:.005em;line-height:1.5;margin-left:auto;margin-right:auto;max-width:720px;text-align:center}@media (max-width:767.98px){h2.article_title[data-v-3469d367]{font-size:5vw;padding:0 .25rem}}h2.article_title[data-v-3469d367] strong{background:none;font-size:1.5em;font-weight:700}h2.article_title[data-v-3469d367] small{font-size:.75em;font-weight:inherit}h2.article_title[data-v-3469d367] span.wbr{display:inline-block}</style> <style>@media (max-width:767.98px){.article-date-item[data-v-d384dd23]{display:inline-block}}</style> <style>.sns-share[data-v-694562d6]{display:flex;gap:8px;justify-content:center;margin:1rem 0;text-align:center}.sns-share-badge[data-v-694562d6]{display:inline-block;font-size:12px;font-weight:700;line-height:1;margin-top:3px;padding:3px 6px;-webkit-user-select:none;user-select:none}.sns-share-btn[data-v-694562d6]{border-radius:6px;display:block;height:44px;transition:background-color .2s;width:44px}.sns-share-btn._x[data-v-694562d6]{background-color:#000;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240' fill='none' viewBox='0 0 240 240'%3E%3Cpath fill='%23fff' d='m88.2 60.66 81.26 118.15h-18.04L70.16 60.66zm4.73-9H53.04l93.64 136.15h39.89zM132.54 109.25l49.7-57.59h-11.25l-43.44 50.33z'/%3E%3Cpath fill='%23fff' d='m105.36 127.72-52.32 60.62H64.3l46.05-53.36z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:contain}@media (any-hover:hover){.sns-share-btn._x[data-v-694562d6]:hover{background-color:#111}}.sns-share-btn._facebook[data-v-694562d6]{background-color:#32529f;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='%23fff' d='M212 197h-37v60h37v176h70V257h50l5-60h-55v-33c0-14 3-20 17-20h38V83h-49c-52 0-76 23-76 67z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:contain}@media (any-hover:hover){.sns-share-btn._facebook[data-v-694562d6]:hover{background-color:#2a4887}}.sns-share-btn._hatena[data-v-694562d6]{background-color:#00a4de;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 500 500'%3E%3Cpath fill='%23fff' d='M278.2 258.1q-13.6-15.2-37.8-17c14.4-3.9 24.8-9.6 31.4-17.3s9.8-17.8 9.8-30.7A55 55 0 0 0 275 166a48.8 48.8 0 0 0-19.2-18.6c-7.3-4-16-6.9-26.2-8.6s-28.1-2.4-53.7-2.4h-62.3v227.2h64.2q38.7 0 55.8-2.6c11.4-1.8 20.9-4.8 28.6-8.9a52.5 52.5 0 0 0 21.9-21.4c5.1-9.2 7.7-19.9 7.7-32.1 0-16.9-4.5-30.4-13.6-40.5m-107-71.4h13.3q23.1 0 31 5.2c5.3 3.5 7.9 9.5 7.9 18s-2.9 14-8.5 17.4-16.1 5-31.4 5h-12.3zM224 317c-6.1 3.7-16.5 5.5-31.1 5.5h-21.7V273h22.6c15 0 25.4 1.9 30.9 5.7s8.4 10.4 8.4 20-3 14.7-9.2 18.4zm133.6-10.9a28.8 28.8 0 1 0 28.8 28.8 28.8 28.8 0 0 0-28.8-28.8m-25-169.7h50v151.52h-50z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:contain}@media (any-hover:hover){.sns-share-btn._hatena[data-v-694562d6]:hover{background-color:#0091c8}}</style> <style>.sidebar{position:sticky;top:32px}.sidebarList{background-color:var(--color-bg-content-static);border-radius:8px;font-size:.75rem;line-height:1.5;list-style:none;max-height:calc(100vh - 96px);overflow:auto;padding:16px;position:relative;--color-bg-content-static:#fff;--color-contents-shadow:#0003}@media (prefers-color-scheme:dark){.sidebarList{--color-bg-content-static:#303030;--color-contents-shadow:#0006}}.sidebarList:before{background-color:var(--color-border);content:"";height:calc(100% - 64px);position:absolute;top:32px;width:1px}.sidebarList_item{color:var(--color-text-p-secondary);font-weight:700;padding-left:16px;position:relative;word-break:auto-phrase}.sidebarList_item:before{background-color:var(--color-btn-secondary);border:3px solid var(--color-bg-content-static);border-radius:50%;content:"";height:6px;left:-5.5px;position:absolute;top:6px;transition:background-color .3s;width:6px}@media (any-hover:hover){.sidebarList_item:hover:before{background-color:var(--primary)}}.sidebarList_item>a{display:inline-block;padding:4px 0;position:relative;transition:color .3s;width:100%}.sidebarList_item__sub{font-size:.75rem;font-weight:400}.sidebarList_item__sub:before{height:4px;left:-4.5px;top:8px;width:4px}.sidebarList_item__sub>a{padding-left:1em}.sidebarList_item.is-active>a{color:var(--primary)}.sidebarList_item.is-active:before{background-color:var(--primary)}@media (any-hover:hover){.sidebarList_item>a:hover{color:var(--primary)}}</style> <style>.SnsButtons[data-v-b5cbd36c]{padding-bottom:32px;padding-top:32px}.SnsButtons-sns[data-v-b5cbd36c]{display:flex;flex-flow:row wrap;gap:16px;justify-content:center}.SnsButtons-head[data-v-b5cbd36c],.SnsButtons-top[data-v-b5cbd36c]{text-align:center}.btn-sm[data-v-b5cbd36c]{align-items:center;display:flex;font-size:.875rem;gap:8px;padding:.25rem .5rem}</style> <style>.author-info[data-v-9742c4dd]{display:flex;margin:32px auto;max-width:640px}@media (max-width:767.98px){.author-info[data-v-9742c4dd]{padding-left:16px;padding-right:16px}}.author-info .btn[data-v-9742c4dd]{border:1px solid #0000;border-radius:.25rem;cursor:pointer;display:inline-block;font-size:1rem;font-weight:400;line-height:1.25;padding:.5rem 1rem;text-align:center;transition:all .2s ease-in-out;-webkit-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.author-info .btn[data-v-9742c4dd],.author-info .btn[data-v-9742c4dd]:active,.author-info .btn[data-v-9742c4dd]:hover{-webkit-text-decoration:none;text-decoration:none}.author-info .btn-x[data-v-9742c4dd]{align-items:center;display:inline-flex;font-size:.75rem;padding:.1em .25em .1em .1em}.author-info .btn-x svg[data-v-9742c4dd]{margin-right:.25rem}.author-avatar[data-v-9742c4dd]{margin-right:24px}.author-avatar img[data-v-9742c4dd]{border-radius:50%}.author-avatar._large img[data-v-9742c4dd]{height:128px;width:128px}.author-desc[data-v-9742c4dd]{line-height:1.75}.author-desc-name[data-v-9742c4dd]{color:var(--color-text-h);display:flex;font-size:1.25rem;margin:0}@media (min-width:768px){.author-desc-name[data-v-9742c4dd]{align-items:center;gap:16px}}@media (max-width:767.98px){.author-desc-name[data-v-9742c4dd]{flex-direction:column;gap:4px}}.author-desc-script[data-v-9742c4dd]{color:var(--color-text-p);font-size:.9rem}.author-desc-script[data-v-9742c4dd] a{color:var(--color-text-a)}@media (any-hover:hover){.author-desc-script[data-v-9742c4dd] a:hover{color:var(--color-text-a-hover)}}.author-desc-script[data-v-9742c4dd] a:visited{color:var(--color-text-a-visited)}.is-inview img[data-v-9742c4dd]{view-transition-name:var(--475ed944)}</style> <style>.banner-img[data-v-84d78e6a]{border-radius:6px;height:auto;width:100%}@media (max-width:767.98px){.banner-img[data-v-84d78e6a]{border-radius:0}}.banners ul[data-v-84d78e6a]{display:grid;gap:1rem;grid-template-columns:repeat(2,1fr);list-style:none;padding:0}@media (max-width:767.98px){.banners ul[data-v-84d78e6a]{grid-template-columns:repeat(1,1fr)}}@media (any-hover:hover){.banners a[data-v-84d78e6a]:hover{filter:brightness(1.2)}}</style> <style>.related[data-v-c7eaaedb]{margin:64px 0}.related-in[data-v-c7eaaedb]{margin:0 auto;max-width:960px}@media (min-width:1200px){.related-in[data-v-c7eaaedb]{max-width:1080px}}@media (max-width:1199.98px){.related-in[data-v-c7eaaedb]{padding:0 1rem}}.related-in-head[data-v-c7eaaedb]{color:var(--color-text-h);font-family:var(--font-sans);font-feature-settings:"palt";font-size:1.5rem;font-weight:400;text-align:center}.related-in-ul[data-v-c7eaaedb]{display:grid;gap:1rem;grid-template-columns:1fr 1fr 1fr 1fr;list-style:none;margin:0;padding:0}@media (max-width:767.98px){.related-in-ul[data-v-c7eaaedb]{grid-template-columns:repeat(auto-fill,minmax(145px,1fr))}}.related-in-ul-li-thumb[data-v-c7eaaedb]{border-radius:6px;margin:0 0 10px;position:relative;transition:all .2s}.related-in-ul-li-thumb-img[data-v-c7eaaedb]{border-radius:6px;height:auto;width:100%}.related-in-ul-li-thumb[data-v-c7eaaedb]:after{border:2px solid #0000;border-radius:6px;box-sizing:border-box;content:"";display:block;height:100%;left:0;pointer-events:none;position:absolute;top:0;transition:border-color .2s;width:100%}.related-in-ul-li-title[data-v-c7eaaedb]{font-size:.9rem;line-height:1.5;text-align:left}.related-in-ul li a[data-v-c7eaaedb]{color:var(--color-text-p);display:block;-webkit-text-decoration:none;text-decoration:none}@supports (word-break:auto-phrase){.related-in-ul li a[data-v-c7eaaedb]{word-break:auto-phrase}}@media (any-hover:hover){.related-in-ul li a[data-v-c7eaaedb]:hover{color:var(--color-text-a-hover)}.related-in-ul li a:hover .related-in-ul-li-thumb[data-v-c7eaaedb]:after{border-color:var(--primary)}.related-in-ul li a:hover .related-in-ul-li-title[data-v-c7eaaedb]{-webkit-text-decoration:none;text-decoration:none}}</style> <style>.header-breadcrumb[data-v-b934bba3]{background:var(--color-bg);container-type:inline-size;top:0;width:100%;z-index:10}.header-breadcrumb__inner[data-v-b934bba3]{font-size:.75rem;margin:0 auto;max-width:960px}@container (1200px <= width){.header-breadcrumb__inner[data-v-b934bba3]{max-width:1080px}}@media (max-width:991.98px){.header-breadcrumb__inner[data-v-b934bba3]{padding-left:16px;padding-right:16px}}.header-breadcrumb__inner ul[data-v-b934bba3]{margin:0;overflow:hidden;padding:0;width:100%}.header-breadcrumb__inner ul li[data-v-b934bba3]{color:#ccc;display:inline;line-height:36px;margin-right:.5em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.header-breadcrumb__inner ul li a[data-v-b934bba3]{color:var(--color-text-p);line-height:inherit;-webkit-text-decoration:none;text-decoration:none;transition:all .3s}@media (any-hover:hover){.header-breadcrumb__inner ul li a[data-v-b934bba3]:hover{color:var(--color-text-a)}}.header-breadcrumb__inner ul li[data-v-b934bba3]:after{content:"/";margin-left:.5em}.header-breadcrumb__inner ul li[data-v-b934bba3]:last-child{margin-left:0}.header-breadcrumb__inner ul li[data-v-b934bba3]:last-child:after{content:""}.header-breadcrumb__inner ul li .date[data-v-b934bba3]{color:#888}.header-breadcrumb__inner nav[data-v-b934bba3]{line-height:36px;min-width:60px}@media (max-width:1199.98px){.header-breadcrumb__inner nav[data-v-b934bba3]{margin-right:10px}}</style> <link rel="stylesheet" href="/_nuxt/Logo.B08_Goey.css"> <link rel="stylesheet" href="/_nuxt/CopyrightFooter.QnetxqVn.css"> <link rel="stylesheet" href="/_nuxt/style.DVjyf-m9.css"> <link rel="stylesheet" href="/_nuxt/StaffItem.DNxbzzNe.css"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/CimHLzkX.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/nEE18IA-.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/BJfczQ26.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/C-0LdZH-.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/SsJVy9aN.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/DyrHuGZd.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/B0KK5IHd.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/CrLfLwun.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/3M2JxWNy.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/CJSCuD5P.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/DXINm9ZB.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/CTIKuer1.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/DHthBGao.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/CMx0JrsU.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/BoQVk32p.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/DU2oTVfN.js"> <link rel="modulepreload" as="script" crossorigin href="/_nuxt/DEGgh01b.js"> <link rel="dns-prefetch" href="https://ics-creative.github.io"> <link rel="prefetch" as="image" type="image/png" href="/_nuxt/logo-website.Cz5k_taM.png"> <meta name="referrer" content="unsafe-url"> <meta name="format-detection" content="telephone=no"> <meta name="author" content="株式会社ICS"> <meta name="color-scheme" content="light dark"> <meta name="theme-color" content="#eff2f5" media="(prefers-color-scheme: light)"> <meta name="theme-color" content="#202020" media="(prefers-color-scheme: dark)"> <meta name="apple-mobile-web-app-title" content="ICS MEDIA"> <meta name="apple-mobile-web-app-status-bar-style" content="default"> <link rel="icon" href="/_assets/icons/favicon.png"> <link rel="apple-touch-icon" href="/_assets/icons/apple-touch-icon.png"> <link rel="alternate" type="application/rss+xml" href="/feed/atom.xml"> <link rel="manifest" href="/_assets/manifest_static.json"> <link rel="author" href="http://www.hatena.ne.jp/ics-media/"> <meta name="description" content="ウェブサイトに欠かせない画像コンテンツ。AdobePhotoshopなどで加工し書き出すことも多いですが、SVGフィルターを使用すると同じように複雑な効果を表現できます。本記事では、SVGフィルターを使っていろいろな雰囲気の画像加工の作例を紹介します。"> <meta property="article:author" content="https://www.facebook.com/icswebjp"> <meta property="fb:pages" content="1414915712086775"> <meta property="og:locale" content="ja_JP"> <meta property="og:type" content="website"> <meta property="og:title" content="コピペOK! SVGフィルターを使った画像加工の作例集 - ICS MEDIA"> <meta property="og:description" content="ウェブサイトに欠かせない画像コンテンツ。AdobePhotoshopなどで加工し書き出すことも多いですが、SVGフィルターを使用すると同じように複雑な効果を表現できます。本記事では、SVGフィルターを使っていろいろな雰囲気の画像加工の作例を紹介します。"> <meta property="og:url" content="https://ics.media/entry/241122/"> <meta property="og:site_name" content="ICS MEDIA"> <meta property="og:image" content="https://ics.media/entry/241122/images/eyecatch.png"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:description" content="ウェブサイトに欠かせない画像コンテンツ。AdobePhotoshopなどで加工し書き出すことも多いですが、SVGフィルターを使用すると同じように複雑な効果を表現できます。本記事では、SVGフィルターを使っていろいろな雰囲気の画像加工の作例を紹介します。"> <meta name="twitter:title" content="コピペOK! SVGフィルターを使った画像加工の作例集 - ICS MEDIA"> <meta name="twitter:image" content="https://ics.media/entry/241122/images/eyecatch.png"> <meta name="twitter:site" content="@icsweb"> <meta property="article:published_time" content="2024-11-29T00:00:00+09:00"> <meta property="article:modified_time" content="2024-11-29T00:00:00+09:00"> <meta property="og:updated_time" content="2024-11-29T00:00:00+09:00"> <meta name="date" content="2024-11-29T00:00:00+09:00"> <meta name="robots" content="max-image-preview:large"> <link rel="canonical" href="https://ics.media/entry/241122/"> <script type="application/ld+json">{"@context":"http://schema.org","@type":"BlogPosting","mainEntityOfPage":{"@type":"WebPage","@id":"https://ics.media/entry/241122/"},"headline":"コピペOK! SVGフィルターを使った画像加工の作例集","image":{"@type":"ImageObject","url":"/entry/241122/images/eyecatch.png","height":512,"width":1280},"datePublished":"2024-11-29","dateModified":"2024-11-29","author":{"@type":"Organization","name":"株式会社ICS"},"publisher":{"@type":"Organization","name":"株式会社ICS","logo":{"@type":"ImageObject","url":"/_assets/icons/apple-touch-icon.png","width":512,"height":512}},"description":""}</script> <script type="module" src="/_nuxt/CimHLzkX.js" crossorigin></script></head><body><div id="__nuxt"><div class="ly-top" data-v-53af800e><div class="ly-top-header" data-v-53af800e><div class="mediaHeader" data-v-53af800e data-v-c016e82a><div class="mediaHeader-row" data-v-c016e82a><h1 data-v-c016e82a><a href="/" class="" title="ICS MEDIA" data-v-c016e82a data-v-39193113><span data-v-39193113>ICS MEDIA</span></a></h1><div class="mediaHeader-row-tool" data-v-c016e82a><span class="mediaHeader-row-tool-item mediaHeader-row-tool-item_search" data-v-c016e82a><a href="/entry/search/" class="" title="サイト内を検索する" data-v-c016e82a><svg width="32" height="32" viewBox="0 0 24 24" data-v-c016e82a><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" data-v-c016e82a></path><path d="M0 0h24v24H0z" fill="none" data-v-c016e82a></path></svg></a></span></div></div></div><nav class="category" categoryid data-v-53af800e data-v-5ddcd2fd><ul class="category-list" data-v-5ddcd2fd><!--[--><li class="category-list-item" data-v-5ddcd2fd><a href="/entry/category/design/" class="" data-v-5ddcd2fd>UIデザイナー</a></li><li class="category-list-item" data-v-5ddcd2fd><a href="/entry/category/html5/" class="" data-v-5ddcd2fd>HTMLコーダー</a></li><li class="category-list-item" data-v-5ddcd2fd><a href="/entry/category/frontend/" class="" data-v-5ddcd2fd>フロントエンジニア</a></li><li class="category-list-item" data-v-5ddcd2fd><a href="/entry/category/creative/" class="" data-v-5ddcd2fd>クリエイティブコーダー</a></li><li class="category-list-item" data-v-5ddcd2fd><a href="/entry/category/3d/" class="" data-v-5ddcd2fd>3Dデベロッパー</a></li><!--]--></ul></nav></div><div itemscope itemtype="http://schema.org/Article" style="display:none;" data-v-53af800e data-v-cb0dd5fc><div class="heroSpace_padding heroSpace" data-v-cb0dd5fc><iframe src="/_assets/top_hero/archives.html" width="100%" height="100%" tabindex="-1" aria-hidden="true" loading="lazy" data-v-cb0dd5fc></iframe><div class="heroSpace-title" data-v-cb0dd5fc><header data-v-cb0dd5fc><p data-v-cb0dd5fc><!--[--><!--]--></p><h1 itemprop="name" data-v-cb0dd5fc><!--[--><!--]--></h1></header></div></div></div><!--[--><div data-v-da421125><div class="eyecatch" data-v-da421125 style="--0e97d286:eyecatch-241122;" data-v-921b35f7><div class="eyecatch-blur-container" data-v-921b35f7><img class="eyecatch-blur" fetchpriority="high" src="/entry/241122/images/eyecatch.png" width="1280" height="512" alt="" data-v-921b35f7></div><div class="eyecatch-inner" data-v-921b35f7><img src="/entry/241122/images/eyecatch.png" alt="" width="1280" height="512" class="eyecatch-inner-img" fetchpriority="high" data-v-921b35f7></div></div><main class="wrap_960" data-v-da421125 data-v-49d92408><article data-v-49d92408><h2 class="article_title" data-v-49d92408 data-v-3469d367>コピペOK!<br>SVGフィルターを使った画像加工の作例集</h2><div class="article-date" data-v-49d92408><span itemprop="datePublished" content="2024-11-29" class="article-date-item" data-v-49d92408 data-v-d384dd23>2024年11月29日 公開 </span><span class="article-date-item article-date-slash" data-v-49d92408> / </span><a href="/entry/staff/sawada/" class="article-date-item" data-v-49d92408>株式会社ICS 澤田 悠</a></div><ul class="article-tag" data-v-49d92408><!--[--><li data-v-49d92408><a href="/entry/tag/CSS/" class="" data-v-49d92408>CSS</a></li><li data-v-49d92408><a href="/entry/tag/SVG/" class="" data-v-49d92408>SVG</a></li><!--]--></ul><div class="sns-share" data-v-49d92408 data-v-694562d6><div data-v-694562d6><a href="https://twitter.com/intent/tweet?url=https://ics.media/entry/241122/&text=コピペOK! SVGフィルターを使った画像加工の作例集 - ICS MEDIA" class="sns-share-btn _x" target="_blank" title="X(旧Twitter)でシェア" data-v-694562d6></a><span class="sns-share-badge" data-v-694562d6></span></div><div data-v-694562d6><a class="sns-share-btn _hatena" href="https://b.hatena.ne.jp/entry/s/ics.media/entry/241122/" target="_blank" title="はてなブックマークでブックマーク" data-v-694562d6></a><span class="sns-share-badge" data-v-694562d6>14</span></div></div><div class="entry" data-v-49d92408><div class="entry-article article" data-v-49d92408><section data-v-49d92408><p>ウェブサイトに欠かせない画像コンテンツ。Adobe Photoshopなどで加工し書き出すことも多いですが、SVGフィルターを使用すると同じように複雑な効果を表現できます。</p> <p>本記事では、SVGフィルターを使っていろいろな雰囲気の画像加工の作例を紹介します。数値を変えると雰囲気もガラリと変わりますのでコピペして色々とお試しいただき、ぜひ取り入れてみてください。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_all.png 1920w, /entry/241122/images/241122_svg_filter_all__960.png 960w" src="/entry/241122/images/241122_svg_filter_all.png" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="SVGフィルター作例まとめ" loading="lazy"></img></p> <h3 id="svg%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95%E3%81%AE%E6%A6%82%E8%A6%81" tabindex="-1">SVGフィルター実装方法の概要</h3> <p>作例紹介の前に、今回の実装方法について概説したいと思います。SVGフィルターの適用にはCSSの<code>filter: url()</code>を使用します。</p> <p>コードで画像加工を行う簡易的な方法として、CSSの<code>filter</code>プロパティを使う方法が挙げられます。<code>filter</code>プロパティに指定できるCSS関数はいくつか用意されており、<code>blur()</code>関数でぼかしたり、<code>contrast()</code>でコントラストを強めたりと簡単な加工が行えます。</p> <p>この<code>filter</code>プロパティに指定できるCSS関数の1つに<code>url()</code>関数があります。<code>url()</code>には、SVGのフィルターを指定できるため、この方法を使用し実装しています。基本以下のように<code>img</code>要素に適用する形でデモを作成していますが、描画が重いフィルターなど一部作例ではSVGの<code>image</code>要素に適用しています。</p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"sample.jpg"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image"</span>></span> </code></pre> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); } </code></pre> <p>「SVG」と聞くと、<code><path></code>タグによって、アイコンなどのベクター形式の画像が描画されるといった場合に使用されるイメージが強いかもしれませんが、実はフィルター機能だけを使用することも可能です。</p> <p>以下のように<code><filter></code>タグの中に、<code><fe〇〇></code>といった名称のSVGフィルター用のタグを追加することで、フィルター機能だけを持ったSVG要素が作成できます。各タグの詳しい説明は省略しますので、今回は大まかな構造や雰囲気だけ理解いただければ幸いです。</p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span><span class="hljs-comment"><!-- CSSで参照できるようidを振る --></span> <span class="hljs-comment"><!-- ここに <fe〇〇> タグを追加していく(上から順に処理されていきます) --></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <h4 id="svg%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%A7%E3%82%88%E3%81%8F%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8B%E5%B1%9E%E6%80%A7%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" tabindex="-1">SVGフィルターでよく使用される属性について</h4> <p>大半の<code><fe〇〇></code>タグに指定できる属性に、<code>in</code>属性と<code>result</code>属性というものがあります。</p> <p><code>in</code>属性で効果を適用する際の入力要素を指定します。<code>result</code>属性は処理結果を一時的に保存しておき、後続のタグの<code>in</code>属性として参照できます。</p> <p>▼例1</p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0.1"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"noise"</span>/></span> <span class="hljs-comment"><!-- resultで保存した「noise」と元画像が合成される --></span> <span class="hljs-tag"><<span class="hljs-name">feBlend</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"noise"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">mode</span>=<span class="hljs-string">"multiply"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <p><code>in</code>属性を省略するか、<code>in</code>属性に空文字を指定すると直前のタグが参照されます。次の2つのコードは例1と同じ結果が得られます。</p> <p>▼例2(<code>in</code>属性の省略)</p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0.1"</span>/></span> <span class="hljs-comment"><!-- 直前のタグまでの処理結果(feTurbulence)と元画像が合成される --></span> <span class="hljs-tag"><<span class="hljs-name">feBlend</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">mode</span>=<span class="hljs-string">"multiply"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <p>▼例3(<code>in</code>属性に空文字を指定)</p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0.1"</span>/></span> <span class="hljs-comment"><!-- 直前のタグまでの処理結果(feTurbulence)と元画像が合成される --></span> <span class="hljs-tag"><<span class="hljs-name">feBlend</span> <span class="hljs-attr">in</span>=<span class="hljs-string">""</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">mode</span>=<span class="hljs-string">"multiply"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <p>作例中に頻出する<code>SourceGraphic</code>は<code>in</code>属性や<code>in2</code>属性に指定できるビルトインのキーワードで、フィルター適用元のグラフィック要素を参照します。</p> <p>そのほか詳しくはMDNのドキュメントを参照ください。</p> <ul> <li><a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/result" target="_blank">result</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/in" target="_blank">in</a></li> <li><a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/in2" target="_blank">in2</a>(合成効果のあるタグでのみ使用される)</li> </ul> <p>なお、合成効果のあるタグで使用される<code>in2</code>属性は省略することも可能ですが、エディターで警告が出るので、作例中では<code>in2=""</code>のように空文字で指定しています。</p> <h3 id="%E4%BD%9C%E4%BE%8B%E7%B4%B9%E4%BB%8B" tabindex="-1">作例紹介</h3> <p>SVGフィルターを用いた画像加工の作例を紹介します。</p> <p>今回の作例は、Google Chrome、Microsoft Edge、Safari、Firefoxで表示されることを確認済みです。SVGフィルターはブラウザーによって出力結果の差が出やすい一面もあるので、取り入れる際には一度手元でご確認いただくことを推奨します。</p> <h4 id="%E3%81%96%E3%82%89%E3%81%96%E3%82%89%E3%83%8E%E3%82%A4%E3%82%BA%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC" tabindex="-1">ざらざらノイズフィルター</h4> <p>ウェブサイトでもよく見かける、ざらざらノイズフィルターです。パッと見控えめですが、手触り感や暖かみを出すためによく使われる表現です。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_rough.jpg 1920w, /entry/241122/images/241122_svg_filter_rough__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_rough.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="ざらざらノイズフィルター" loading="lazy"></img></p> <p>SVGフィルターにはノイズ生成用の<code>feTurbulence</code>タグが組み込まれているので、ノイズ用の画像を用意せずともSVGフィルターだけで完結できます。</p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"images/image-1.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"512"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"384"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image"</span>></span> <span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-comment"><!-- ざらざらノイズ --></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"turbulence"</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0.5"</span> <span class="hljs-attr">numOctaves</span>=<span class="hljs-string">"5"</span>/></span> <span class="hljs-comment"><!-- アルファチャンネルのコントラストを下げる(少し透明にする) --></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncA</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"linear"</span> <span class="hljs-attr">slope</span>=<span class="hljs-string">"0.5"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- オーバーレイで合成 --></span> <span class="hljs-tag"><<span class="hljs-name">feBlend</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">mode</span>=<span class="hljs-string">"multiply"</span>/></span> <span class="hljs-comment"><!-- はみ出したフィルターを元の画像サイズでクリッピング --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"in"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">display</span>: block; <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); } </code></pre> <p>▼やや効果がわかりづらいので元画像と比較 <img srcset="/entry/241122/images/241122_svg_filter_compare.png 1920w, /entry/241122/images/241122_svg_filter_compare__960.png 960w" src="/entry/241122/images/241122_svg_filter_compare.png" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="ざらざらノイズフィルター比較" loading="lazy"></img></p> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/rough-filter.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/rough-filter.html" target="_blank">ソースコードを確認する</a></li> </ul> <h4 id="%E3%82%AC%E3%83%A9%E3%82%B9%E9%A2%A8%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC" tabindex="-1">ガラス風フィルター</h4> <p>細かく画像をゆがめたガラス風のフィルターです。数値を変えると絵っぽく見えるかもしれません。</p> <p>前の作例と同様、<code>feTurbulence</code>でノイズを生成した後、<code>feDisplacementMap</code>で歪ませて、元の画像と合成しています。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_glass.jpg 1920w, /entry/241122/images/241122_svg_filter_glass__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_glass.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="ガラス風フィルター" loading="lazy"></img></p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"images/image-1.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"512"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"384"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image"</span>></span> <span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"fractalNoise"</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0.2"</span> <span class="hljs-attr">numOctaves</span>=<span class="hljs-string">"2"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feDisplacementMap</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">scale</span>=<span class="hljs-string">"10"</span> <span class="hljs-attr">xChannelSelector</span>=<span class="hljs-string">"R"</span> <span class="hljs-attr">yChannelSelector</span>=<span class="hljs-string">"G"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">display</span>: block; <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); } </code></pre> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/glass-filter.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/glass-filter.html" target="_blank">ソースコードを確認する</a></li> </ul> <h4 id="%E3%82%86%E3%82%8C%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC" tabindex="-1">ゆれフィルター</h4> <p>水平方向にゆれる表現のフィルターです。</p> <p>色収差を表現するため、<code>feColorMatrix</code>でRGBそれぞれの色チャンネルを抽出し、Rチャンネルだけ<code>feOffset</code>で水平方向にずらしています。また、ガラス風フィルターと同様、<code>feTurbulence</code>でノイズを生成し<code>feDisplacementMap</code>で歪ませています。ノイズ生成の際、<code>baseFrequency</code>の値を2つ指定することで、X軸Y軸それぞれ別の値が指定できるのでこれを利用し、水平方向に大きく広がるようなノイズを生成しています。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_distortion.jpg 1920w, /entry/241122/images/241122_svg_filter_distortion__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_distortion.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="ゆれフィルター" loading="lazy"></img></p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"images/image-1.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"512"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"384"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image"</span>></span> <span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-comment"><!-- 色チャンネルを分解 --></span> <span class="hljs-comment"><!-- 元の画像から G チャンネルだけ抽出し「g」として登録 --></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"matrix"</span> <span class="hljs-attr">values</span>=<span class="hljs-string">"0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"g"</span>/></span> <span class="hljs-comment"><!-- 元の画像から B チャンネルだけ抽出し「b」として登録 --></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"matrix"</span> <span class="hljs-attr">values</span>=<span class="hljs-string">"0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"b"</span>/></span> <span class="hljs-comment"><!-- 元の画像から R チャンネルだけ抽出し、少しずらしてぼかす --></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"matrix"</span> <span class="hljs-attr">values</span>=<span class="hljs-string">"1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feOffset</span> <span class="hljs-attr">dx</span>=<span class="hljs-string">"3"</span> <span class="hljs-attr">dy</span>=<span class="hljs-string">"1"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feGaussianBlur</span> <span class="hljs-attr">stdDeviation</span>=<span class="hljs-string">"2"</span>/></span> <span class="hljs-comment"><!-- G/B チャンネルを比較(明)モードで重ねる --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"g"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"lighter"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"b"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"lighter"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"rgb-layers"</span>/></span> <span class="hljs-comment"><!-- ゆれの表現 --></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"fractalNoise"</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0 0.1"</span> <span class="hljs-attr">numOctaves</span>=<span class="hljs-string">"2"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feDisplacementMap</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"rgb-layers"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">scale</span>=<span class="hljs-string">"40"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">display</span>: block; <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); <span class="hljs-attribute">clip-path</span>: <span class="hljs-built_in">inset</span>(<span class="hljs-number">0</span> <span class="hljs-number">10px</span>); <span class="hljs-comment">/* ズレの部分を隠すため内側にクリッピング */</span> } </code></pre> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/distortion-filter.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/distortion-filter.html" target="_blank">ソースコードを確認する</a></li> </ul> <h4 id="%E5%92%8C%E7%B4%99%E3%81%A3%E3%81%BD%E3%81%84%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC" tabindex="-1">和紙っぽいフィルター</h4> <p>和紙に印刷されたようなフィルターです。</p> <p><code>feTurbulence</code>でノイズ画像を生成し、<code>feDistantLight</code>で光を当て凹凸を際立たせて紙のように加工しています。そのまま元の画像と合成するとのっぺりとした印象になるので、元画像を紙の明暗に合わせて<code>feDisplacementMap</code>でゆがませつつ乗算で合成しています。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_paper.jpg 1920w, /entry/241122/images/241122_svg_filter_paper__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_paper.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="紙っぽいフィルター" loading="lazy"></img></p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"images/image-1.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"512"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"384"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image"</span>></span> <span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-comment"><!-- 紙 --></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"fractalNoise"</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0.04"</span> <span class="hljs-attr">numOctaves</span>=<span class="hljs-string">"5"</span> /></span> <span class="hljs-tag"><<span class="hljs-name">feDiffuseLighting</span> <span class="hljs-attr">lighting-color</span>=<span class="hljs-string">"white"</span> <span class="hljs-attr">surfaceScale</span>=<span class="hljs-string">"2"</span> ></span> <span class="hljs-tag"><<span class="hljs-name">feDistantLight</span> <span class="hljs-attr">azimuth</span>=<span class="hljs-string">"45"</span> <span class="hljs-attr">elevation</span>=<span class="hljs-string">"60"</span> /></span> <span class="hljs-tag"></<span class="hljs-name">feDiffuseLighting</span>></span> <span class="hljs-tag"><<span class="hljs-name">feGaussianBlur</span> <span class="hljs-attr">stdDeviation</span>=<span class="hljs-string">"0.25"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"paper"</span>/></span> <span class="hljs-comment"><!-- 元画像を紙にマッピングしてゆがませる --></span> <span class="hljs-tag"><<span class="hljs-name">feDisplacementMap</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"paper"</span> <span class="hljs-attr">scale</span>=<span class="hljs-string">"15"</span> <span class="hljs-attr">xChannelSelector</span>=<span class="hljs-string">"R"</span> <span class="hljs-attr">yChannelSelector</span>=<span class="hljs-string">"R"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"photo"</span>/></span> <span class="hljs-comment"><!-- 元画像と合成 --></span> <span class="hljs-tag"><<span class="hljs-name">feBlend</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"paper"</span> <span class="hljs-attr">mode</span>=<span class="hljs-string">"multiply"</span>/></span> <span class="hljs-comment"><!-- はみ出したフィルターをクリッピング --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"photo"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"in"</span> /></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">display</span>: block; <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); } </code></pre> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/paper-filter.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/paper-filter.html" target="_blank">ソースコードを確認する</a></li> </ul> <h4 id="%E3%83%9D%E3%82%B9%E3%82%BF%E3%83%AA%E3%82%BC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3" tabindex="-1">ポスタリゼーション</h4> <p>ポスタリゼーションなフィルターです。ポップな印象にできます。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_posterization.jpg 1920w, /entry/241122/images/241122_svg_filter_posterization__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_posterization.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="ポスタリゼーション" loading="lazy"></img></p> <p><code>feComponentTransfer</code>タグを用いると、RGBAチャンネル別個に色の加工を行うことが可能です。ガンマ補正で画像を明るめに調整しつつ、色の階調数を減らし、最後に任意の色をつける工程を行っています。</p> <p>色の階調を減らす処理(<code>type="discrete"</code>の箇所)で、階調数が5となるよう数を刻んでいますが、色数を減らしたい場合<code>tableValues</code>の値を<code>0 0.33 0.66 1</code>(階調数4)などに変更すると、違った結果が得られます。</p> <p>最終的な色味については、<code>type="table"</code>の<code>tableValues</code>を変更すると反映されます。SVGは0〜255ではなく、0〜1の数字を扱う必要があるので変換して指定しています。色確認と数値変換ができる簡易的なツールを作成しましたので色味の調整にお役立てください。</p> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/color.html" target="_blank">色確認用ツールを別ウインドウで開く</a></li> </ul> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-comment"><!-- 少しぼかす --></span> <span class="hljs-tag"><<span class="hljs-name">feGaussianBlur</span> <span class="hljs-attr">stdDeviation</span>=<span class="hljs-string">"1.2"</span>/></span> <span class="hljs-comment"><!-- 白黒化 --></span> <span class="hljs-tag"><<span class="hljs-name">feColormatrix</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"saturate"</span> <span class="hljs-attr">values</span>=<span class="hljs-string">"0"</span>/></span> <span class="hljs-comment"><!-- ガンマ補正(山型:明るくする) --></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncR</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"gamma"</span> <span class="hljs-attr">exponent</span>=<span class="hljs-string">"0.5"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncG</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"gamma"</span> <span class="hljs-attr">exponent</span>=<span class="hljs-string">"0.5"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncB</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"gamma"</span> <span class="hljs-attr">exponent</span>=<span class="hljs-string">"0.5"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- 階調数5 --></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncR</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"discrete"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0 0.25 0.5 0.75 1"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncG</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"discrete"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0 0.25 0.5 0.75 1"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncB</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"discrete"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0 0.25 0.5 0.75 1"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- 有彩色に変換 --></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncR</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"table"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0.19,0.80,0.27,0.98,0.78"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncG</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"table"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0.21,0.24,0.46,0.86,0.96"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncB</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"table"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0.37,0.46,0.76,0.86,1.00"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- はみ出したフィルターを元の画像サイズでクリッピング --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"in"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">display</span>: block; <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); } </code></pre> <p>また、ガンマ補正の工程は、元の画像の明度差が最適で補正が不要であれば削除したり、元々の画像が明るめの場合は以下のように<code>exponent</code>の値を増やすと暗めに調整できます。</p> <pre><code class="hljs language-html"><span class="hljs-comment"><!-- ガンマ補正(谷型:暗くする) --></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncR</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"gamma"</span> <span class="hljs-attr">exponent</span>=<span class="hljs-string">"1.5"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncG</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"gamma"</span> <span class="hljs-attr">exponent</span>=<span class="hljs-string">"1.5"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncB</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"gamma"</span> <span class="hljs-attr">exponent</span>=<span class="hljs-string">"1.5"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> </code></pre> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/posterization-filter.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/posterization-filter.html" target="_blank">ソースコードを確認する</a></li> </ul> <h4 id="%E3%82%B0%E3%83%AA%E3%83%83%E3%83%81%E3%83%8E%E3%82%A4%E3%82%BA%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC" tabindex="-1">グリッチノイズフィルター</h4> <p>グリッチノイズ(画面の乱れのような)フィルターです。エッジの効いた雰囲気を作るのに役立ちます。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_glitch.jpg 1920w, /entry/241122/images/241122_svg_filter_glitch__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_glitch.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="グリッチノイズフィルター" loading="lazy"></img></p> <p>ブロック状の乱れは、<code>feTurbulence</code>でランダムな高さのストライプ状のノイズを生成し、<code>feComposite</code>で元となる画像と合成しつつ<code>feOffset</code>でずらすといった工程を、数値を変えつつ数回行うことで実装しています。</p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"imageWrapper"</span>></span> <span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"images/image-1.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"512"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"384"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">""</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image"</span>></span> <span class="hljs-tag"></<span class="hljs-name">div</span>></span> <span class="hljs-comment"><!-- グリッチノイズフィルター --></span> <span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-comment"><!-- 色チャンネルを分解 --></span> <span class="hljs-comment"><!-- G チャンネル --></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"matrix"</span> <span class="hljs-attr">values</span>=<span class="hljs-string">"0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"g"</span>/></span> <span class="hljs-comment"><!-- B チャンネル --></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"matrix"</span> <span class="hljs-attr">values</span>=<span class="hljs-string">"0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"b"</span>/></span> <span class="hljs-comment"><!-- R チャンネルを少しずらす --></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"matrix"</span> <span class="hljs-attr">values</span>=<span class="hljs-string">"1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feOffset</span> <span class="hljs-attr">dx</span>=<span class="hljs-string">"8"</span> <span class="hljs-attr">dy</span>=<span class="hljs-string">"0"</span>/></span> <span class="hljs-comment"><!-- G/B を比較(明)モードで重ね、「rgb-layers」として登録しておく --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"g"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"lighter"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"b"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"lighter"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"rgb-layers"</span>/></span> <span class="hljs-comment"><!-- ずらし1回目 --></span> <span class="hljs-comment"><!-- 水平方向に伸びたフラクタルノイズを追加 --></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"fractalNoise"</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0 0.02"</span> <span class="hljs-attr">numOctaves</span>=<span class="hljs-string">"3"</span>/></span> <span class="hljs-comment"><!-- 輝度をアルファに(輝度が低い領域はより透明になり、輝度が高い領域はより不透明になる) --></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"luminanceToAlpha"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- 透明と黒で2値化 --></span> <span class="hljs-tag"><<span class="hljs-name">feFuncA</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"discrete"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0,1"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- 黒い部分だけ合体し、水平方向にずらす --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"rgb-layers"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"xor"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feOffset</span> <span class="hljs-attr">dx</span>=<span class="hljs-string">"8"</span> <span class="hljs-attr">dy</span>=<span class="hljs-string">"0"</span> /></span> <span class="hljs-comment"><!-- Rレイヤーだけずらしておいた画像と合体 --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"rgb-layers"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"over"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"wip1"</span>/></span> <span class="hljs-comment"><!-- ずらし2回目(値を変えて同じ工程を繰り返す) --></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"fractalNoise"</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0 0.01"</span> <span class="hljs-attr">numOctaves</span>=<span class="hljs-string">"4"</span> <span class="hljs-attr">seed</span>=<span class="hljs-string">"5"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"luminanceToAlpha"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncA</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"discrete"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0,1"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"rgb-layers"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"xor"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feOffset</span> <span class="hljs-attr">dx</span>=<span class="hljs-string">"2"</span> <span class="hljs-attr">dy</span>=<span class="hljs-string">"0"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"wip1"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"over"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"wip2"</span>/></span> <span class="hljs-comment"><!-- ずらし3回目 --></span> <span class="hljs-tag"><<span class="hljs-name">feTurbulence</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"fractalNoise"</span> <span class="hljs-attr">baseFrequency</span>=<span class="hljs-string">"0 0.01"</span> <span class="hljs-attr">numOctaves</span>=<span class="hljs-string">"3"</span> <span class="hljs-attr">seed</span>=<span class="hljs-string">"8"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"luminanceToAlpha"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncA</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"discrete"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0,1"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"rgb-layers"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"xor"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feOffset</span> <span class="hljs-attr">dx</span>=<span class="hljs-string">"-15"</span> <span class="hljs-attr">dy</span>=<span class="hljs-string">"0"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"wip2"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"over"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <p>アナログテレビのように見せるための走査線(薄いストライプ模様)については、CSSを用いた実装が簡単だったので、<code>repeating-linear-gradient()</code>でパターンを作成し、<code>mix-blend-mode</code>で合成しています(なくてもOKです)。</p> <pre><code class="hljs language-css"><span class="hljs-selector-class">.imageWrapper</span> { <span class="hljs-attribute">position</span>: relative; <span class="hljs-attribute">clip-path</span>: <span class="hljs-built_in">inset</span>(<span class="hljs-number">15px</span>); <span class="hljs-comment">/* ズレの部分を隠すため内側にクリッピング */</span> } <span class="hljs-comment">/* 走査線 */</span> <span class="hljs-selector-class">.imageWrapper</span><span class="hljs-selector-pseudo">::after</span> { <span class="hljs-attribute">content</span>: <span class="hljs-string">""</span>; <span class="hljs-attribute">position</span>: absolute; <span class="hljs-attribute">inset</span>: <span class="hljs-number">0</span>; <span class="hljs-attribute">background-image</span>: <span class="hljs-built_in">repeating-linear-gradient</span>(transparent, transparent <span class="hljs-number">6px</span>, <span class="hljs-number">#0006</span> <span class="hljs-number">6px</span>, <span class="hljs-number">#0006</span> <span class="hljs-number">8px</span>); <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">blur</span>(<span class="hljs-number">2px</span>); <span class="hljs-attribute">mix-blend-mode</span>: overlay; } <span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">display</span>: block; <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); } </code></pre> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/glitch-filter.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/glitch-filter.html" target="_blank">ソースコードを確認する</a></li> </ul> <h4 id="%E3%83%89%E3%83%83%E3%83%88%E7%B5%B5%E9%A2%A8%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC" tabindex="-1">ドット絵風フィルター</h4> <p>レトロゲームのようなドット絵風のフィルターです。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_pixel_art.jpg 1920w, /entry/241122/images/241122_svg_filter_pixel_art__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_pixel_art.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="ドット絵風フィルター" loading="lazy"></img></p> <p>ポップな印象になるよう、<code>feComponentTransfer</code>でRGBチャンネルそれぞれの色の階調を減らしています。<code>tableValues</code>の値を変えて階調を増減したり、ピクセルのサイズを変えるとまた違った雰囲気にできます。</p> <p>ドット化は<code>feFlood</code>で小さな矩形を用意し、<code>feTile</code>タグで矩形を敷き詰め、<code>feMorphology</code>タグで色のついたピクセル(タイルのサイズ)を膨張させることで表現しています。</p> <p><code>feTile</code>タグについてですが、一部ブラウザーで描画が不安定な場合があります。ここまで紹介してきた作例のように<code>img</code>要素へ適用すると、Safariで描画が不安定になったので、SVGの<code>image</code>要素で画像を読み込み、適用することで描画を安定させています。</p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"512"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"384"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">image</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"images/image-1.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> <span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-comment"><!-- 色の階調を減らす --></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"color"</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncR</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"discrete"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0,0.5,1"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncG</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"discrete"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0,0.5,1"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncB</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"discrete"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0,0.5,1"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- タイル --></span> <span class="hljs-tag"><<span class="hljs-name">feFlood</span> <span class="hljs-attr">x</span>=<span class="hljs-string">"2"</span> <span class="hljs-attr">y</span>=<span class="hljs-string">"2"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"1"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"1"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"4"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"4"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feTile</span> /></span> <span class="hljs-comment"><!-- 画像とタイルの重なり部分を合成 --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"color"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"in"</span>/></span> <span class="hljs-comment"><!-- タイルのサイズを膨張 --></span> <span class="hljs-tag"><<span class="hljs-name">feMorphology</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"dilate"</span> <span class="hljs-attr">radius</span>=<span class="hljs-string">"2"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); } </code></pre> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/pixel-art-filter.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/pixel-art-filter.html" target="_blank">ソースコードを確認する</a></li> </ul> <h4 id="%E6%96%B0%E8%81%9E%E3%81%AE%E5%86%99%E7%9C%9F%E9%A2%A8%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC" tabindex="-1">新聞の写真風フィルター</h4> <p>白黒のドットで画像の濃淡を表現した、新聞の写真のようなフィルターです。残念ながらブラウザーによって少し雰囲気が変わってしまいますが、いずれもレトロ感は表現できていると思います。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_dotgain.jpg 1920w, /entry/241122/images/241122_svg_filter_dotgain__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_dotgain.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="新聞の写真風フィルター" loading="lazy"></img></p> <p>ドット絵の実装方法と同じように<code>feTile</code>で矩形をタイリングしつつ、元画像の輝度に応じてドットのサイズが変わるハーフトーンのように加工しています。<code>feTile</code>タグでタイルを用意する工程について、Firefoxでの描画を安定させるため、2つ用意したそれぞれの矩形でタイル化を行い、最後に合成する方法にしています。</p> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"512"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"384"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">image</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"images/image-1.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> <span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-comment"><!-- 4px四方のタイルの作成 --></span> <span class="hljs-comment"><!-- ■□ --></span> <span class="hljs-comment"><!-- □□ --></span> <span class="hljs-tag"><<span class="hljs-name">feFlood</span> <span class="hljs-attr">x</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">y</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"2"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"2"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"4"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"4"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feTile</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"tile1"</span>/></span> <span class="hljs-comment"><!-- □□ --></span> <span class="hljs-comment"><!-- □■ --></span> <span class="hljs-tag"><<span class="hljs-name">feFlood</span> <span class="hljs-attr">x</span>=<span class="hljs-string">"2"</span> <span class="hljs-attr">y</span>=<span class="hljs-string">"2"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"2"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"2"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"4"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"4"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feTile</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"tile2"</span>/></span> <span class="hljs-comment"><!-- タイル同士を合成 --></span> <span class="hljs-comment"><!-- ■□ --></span> <span class="hljs-comment"><!-- □■ --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"tile1"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"tile2"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"over"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"tile"</span>/></span> <span class="hljs-comment"><!-- 元画像の輝度をアルファにして、反転 --></span> <span class="hljs-tag"><<span class="hljs-name">fecolormatrix</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"luminanceToAlpha"</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncA</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"linear"</span> <span class="hljs-attr">slope</span>=<span class="hljs-string">"-1"</span> <span class="hljs-attr">intercept</span>=<span class="hljs-string">"1"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- タイルと画像の重なり合った部分を合成 --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"tile"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"in"</span>/></span> <span class="hljs-comment"><!-- ぼかして、アルファチャンネルのコントラストを上げる --></span> <span class="hljs-tag"><<span class="hljs-name">feGaussianBlur</span> <span class="hljs-attr">stdDeviation</span>=<span class="hljs-string">"1"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncA</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"linear"</span> <span class="hljs-attr">slope</span>=<span class="hljs-string">"16"</span> <span class="hljs-attr">intercept</span>=<span class="hljs-string">"-5"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- はみ出したフィルターを元の画像サイズでクリッピング --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"in"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"SourceGraphic"</span> /></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); } </code></pre> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/dotgain-filter.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/dotgain-filter.html" target="_blank">ソースコードを確認する</a></li> </ul> <h4 id="%E3%82%B0%E3%83%A9%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%83%83%E3%83%97%E3%81%A8%E3%82%B9%E3%83%88%E3%83%A9%E3%82%A4%E3%83%97%E3%81%AA%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC" tabindex="-1">グラデーションマップとストライプなフィルター</h4> <p>グラデーションマップと横線を組み合わせたフィルターです。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_stripe_gradationmap.jpg 1920w, /entry/241122/images/241122_svg_filter_stripe_gradationmap__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_stripe_gradationmap.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="グラデーションマップとストライプなフィルター" loading="lazy"></img></p> <p>前述した作例でも使用した方法を以下のように組み合わせています。</p> <ul> <li>ドット絵の実装方法と同じように、<code>feTile</code>で矩形のタイリングを行う。</li> <li>ポスタリゼーションの作例の後半の工程と同様に、<code>feFuncX</code>タグに<code>type="table"</code>を設定し、<code>tableValues</code>の値を調整しグラデーションを作成してマップ。</li> </ul> <pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"512"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"384"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">image</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"images/image-1.jpg"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> <span class="hljs-tag"><<span class="hljs-name">svg</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2000/svg"</span>></span> <span class="hljs-tag"><<span class="hljs-name">filter</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"filter"</span>></span> <span class="hljs-comment"><!-- 横線(画像の暗い部分を描画) --></span> <span class="hljs-tag"><<span class="hljs-name">fecolormatrix</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"luminanceToAlpha"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"mono"</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncA</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"linear"</span> <span class="hljs-attr">slope</span>=<span class="hljs-string">"-1"</span> <span class="hljs-attr">intercept</span>=<span class="hljs-string">"1"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFlood</span> <span class="hljs-attr">x</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">y</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"600"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"2"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"600"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"5"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feTile</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"mono"</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">""</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"in"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feGaussianBlur</span> <span class="hljs-attr">stdDeviation</span>=<span class="hljs-string">"1"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncA</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"linear"</span> <span class="hljs-attr">slope</span>=<span class="hljs-string">"15"</span> <span class="hljs-attr">intercept</span>=<span class="hljs-string">"-5"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"stripe"</span>></span> <span class="hljs-comment"><!-- 線を青めにする --></span> <span class="hljs-tag"><<span class="hljs-name">feFuncG</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"linear"</span> <span class="hljs-attr">slope</span>=<span class="hljs-string">"-1"</span> <span class="hljs-attr">intercept</span>=<span class="hljs-string">"0.3"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncB</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"linear"</span> <span class="hljs-attr">slope</span>=<span class="hljs-string">"-1"</span> <span class="hljs-attr">intercept</span>=<span class="hljs-string">"1"</span>/></span> <span class="hljs-comment"><!-- アルファチャンネルのコントラストを下げる(少し透明にする) --></span> <span class="hljs-tag"><<span class="hljs-name">feFuncA</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"linear"</span> <span class="hljs-attr">slope</span>=<span class="hljs-string">"0.8"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- グラデーションマップ --></span> <span class="hljs-tag"><<span class="hljs-name">feGaussianBlur</span> <span class="hljs-attr">stdDeviation</span>=<span class="hljs-string">"1"</span> <span class="hljs-attr">in</span>=<span class="hljs-string">"SourceGraphic"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feColorMatrix</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"saturate"</span> <span class="hljs-attr">values</span>=<span class="hljs-string">"0"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-tag"><<span class="hljs-name">feFuncR</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"table"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0.34,0.53,0.33,1.00,0.82"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncG</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"table"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0.00,0.27,0.72,0.78,0.98"</span>/></span> <span class="hljs-tag"><<span class="hljs-name">feFuncB</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"table"</span> <span class="hljs-attr">tableValues</span>=<span class="hljs-string">"0.14,0.41,0.75,0.89,1.00"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">feComponentTransfer</span>></span> <span class="hljs-comment"><!-- 画像と横線を合成 --></span> <span class="hljs-tag"><<span class="hljs-name">feBlend</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"stripe"</span> <span class="hljs-attr">mode</span>=<span class="hljs-string">"multiply"</span> <span class="hljs-attr">result</span>=<span class="hljs-string">"color"</span>/></span> <span class="hljs-comment"><!-- はみ出したフィルターを元の画像サイズでクリッピング --></span> <span class="hljs-tag"><<span class="hljs-name">feComposite</span> <span class="hljs-attr">in2</span>=<span class="hljs-string">"SourceGraphic"</span> <span class="hljs-attr">operator</span>=<span class="hljs-string">"in"</span>/></span> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span> <span class="hljs-tag"></<span class="hljs-name">svg</span>></span> </code></pre> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">#filter</span>); } </code></pre> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/stripe-filter.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/stripe-filter.html" target="_blank">ソースコードを確認する</a></li> </ul> <h3 id="%E3%81%8A%E3%81%BE%E3%81%91%E6%A4%9C%E8%A8%BC" tabindex="-1">おまけ検証</h3> <ul> <li><a href="https://ics-creative.github.io/241122_svg_filter/src/filter-test.html" target="_blank">サンプルを別ウインドウで開く</a></li> <li><a href="https://github.com/ics-creative/241122_svg_filter/blob/main/src/filter-test.html" target="_blank">ソースコードを確認する</a></li> </ul> <h4 id="%E5%A4%96%E9%83%A8svg%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" tabindex="-1">外部SVGリソースについて</h4> <p>ChromeやEdge、Firefox等の一部ブラウザーではSVGフィルターを外部リソース化しておき参照することが可能です。</p> <pre><code class="hljs language-css"><span class="hljs-selector-class">.image</span> { <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">sample-filter.svg#filter</span>); } </code></pre> <p>執筆時点(2024年11月)ではSafariが未対応ですので、htmlにSVGタグをベタ書きするのが良いでしょう。</p> <h4 id="video%E3%82%BF%E3%82%B0%E3%81%B8%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E9%81%A9%E7%94%A8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" tabindex="-1">videoタグへのフィルター適用について</h4> <p>一部のブラウザーでは<code>video</code>タグにSVGフィルターをかけられます。</p> <p>ChromeとEdgeは問題なく再生でき、Firefoxはフィルターの描画の重さによって動いたり止まったりするようです。また、残念なことにSafariではまったく動かないようでした。SVGの描画はブラウザー間の差がよくあるので、必ず確認を行うようにしましょう。</p> <h4 id="%E3%81%9D%E3%81%AE%E3%81%BB%E3%81%8B%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E9%81%A9%E7%94%A8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" tabindex="-1">そのほかフィルター適用について</h4> <p>文字など画像以外のDOM要素にも適用できます。複雑な見た目でありながらただのフィルターなので、DOMへの影響はもちろんありません。<strong>スクリーンリーダーの読み上げや、コピペもできるのはコードならではの利点</strong>です。</p> <p>複雑なフィルターの場合は、ユーザー体験を損なわないよう使い所にご注意ください。</p> <p><img srcset="/entry/241122/images/241122_svg_filter_test.jpg 1920w, /entry/241122/images/241122_svg_filter_test__960.jpg 960w" src="/entry/241122/images/241122_svg_filter_test.jpg" sizes="(max-width:720px) 100vw, 720px" width="1920" height="1080" alt="フィルター適用の検証" loading="lazy"></img></p> <h3 id="%E3%81%BE%E3%81%A8%E3%82%81" tabindex="-1">まとめ</h3> <p>SVGフィルターと一部CSSを用いた、画像加工の作例を紹介しました。CSSのみの実装と比較すると、SVGフィルターはかなり自由度が高い実装方法だと感じました。とくにノイズを使える点などは大きな利点です。</p> <p>本記事では解説していませんが、他の実装方法として挙げられるCSSやWebGLと比較すると以下のようにメリット・デメリットがまとめられます。</p> <p><strong>できることの多さ=ハードル:CSS < SVG < WebGL(Canvas)</strong></p> <ul> <li>CSS <ul> <li>メリット:手軽に試せてぼかしや色味の変更等オーソドックスな加工が可能。</li> <li>デメリット:複雑な加工はできない。</li> </ul> </li> <li>SVG <ul> <li>メリット:ライブラリを導入する必要がなく気軽に試せる。ノイズが便利。自由度が高い。</li> <li>デメリット:ブラウザーによって異なる出力結果になることがあるので確認やチューニングが必要。</li> </ul> </li> <li>WebGL(Canvas) <ul> <li>メリット:自由度が高く、ダイナミックでかっこいい演出などがたくさん。描画が軽い。</li> <li>デメリット:数学やシェーダー言語(GLSL)の知識が必要になるなど敷居が高め。</li> </ul> </li> </ul> <p>これらの実装方法の違いについては、記事『<a href="https://ics.media/entry/200520/">君は使い分けられるか? CSS/SVG/Canvasのビジュアル表現でできること・できないこと</a>』にて詳しく比較していますので、ぜひご覧ください。</p> <p>コードとして画像の加工を行うことで、ホバー時だけ加工された画像を使ってみたり、フィルターをアニメーションさせてみるなどといった表現の拡張性もあります。今回の記事がSVGフィルターへ興味を持つきっかけになれば幸いです。</p> <p>作例集として完成済みのコードを紹介しましたが、フィルタータグの一部をコメントアウトしてみたり順番を入れ替えてみると、おもしろいフィルターができるかもしれません、色々と組み合わせて取り入れてみてはいかがでしょうか?</p> <h4 id="%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88" tabindex="-1">参考サイト</h4> <ul> <li><a href="https://developer.mozilla.org/ja/docs/Web/CSS/filter" target="_blank">filter - CSS: カスケーディングスタイルシート | MDN</a></li> <li><a href="https://lopan.jp/about-svg/filter/" target="_blank">SVGのフィルター効果 - SVGでやることのまとめ。</a></li> <li><a href="https://fuuno.net/ani/filter/feCompsite/feComposite.html" target="_blank">SVG、feCompositeで要素を切り抜き。</a></li> <li><a href="https://srufaculty.sru.edu/david.dailey/svg/SVGOpen2010/filters2.htm" target="_blank">Filter Effects in SVG: Dailey</a></li> <li><a href="https://tympanus.net/codrops/2019/02/05/svg-filter-effects-duotone-images-with-fecomponenttransfer/" target="_blank">SVG Filter Effects: Duotone Images with <feComponentTransfer> | Codrops</a></li> <li><a href="http://defghi1977.html.xdomain.jp/tech/svgMemo/svgMemo_11.htm" target="_blank">svg要素の基本的な使い方まとめ</a></li> </ul> </section><!----></div><div class="entry-sidebar" data-v-49d92408><div class="sidebar" data-v-49d92408><ol class="sidebarList"><li class="sidebarList_item"><a href="#top">冒頭</a></li><!--[--><li data-index="0" class="sidebarList_item"><a href="#svg%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95%E3%81%AE%E6%A6%82%E8%A6%81">SVGフィルター実装方法の概要</a></li><li data-index="1" class="sidebarList_item sidebarList_item__sub"><a href="#svg%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%A7%E3%82%88%E3%81%8F%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8B%E5%B1%9E%E6%80%A7%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">SVGフィルターでよく使用される属性について</a></li><li data-index="2" class="sidebarList_item"><a href="#%E4%BD%9C%E4%BE%8B%E7%B4%B9%E4%BB%8B">作例紹介</a></li><li data-index="3" class="sidebarList_item sidebarList_item__sub"><a href="#%E3%81%96%E3%82%89%E3%81%96%E3%82%89%E3%83%8E%E3%82%A4%E3%82%BA%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC">ざらざらノイズフィルター</a></li><li data-index="4" class="sidebarList_item sidebarList_item__sub"><a href="#%E3%82%AC%E3%83%A9%E3%82%B9%E9%A2%A8%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC">ガラス風フィルター</a></li><li data-index="5" class="sidebarList_item sidebarList_item__sub"><a href="#%E3%82%86%E3%82%8C%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC">ゆれフィルター</a></li><li data-index="6" class="sidebarList_item sidebarList_item__sub"><a href="#%E5%92%8C%E7%B4%99%E3%81%A3%E3%81%BD%E3%81%84%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC">和紙っぽいフィルター</a></li><li data-index="7" class="sidebarList_item sidebarList_item__sub"><a href="#%E3%83%9D%E3%82%B9%E3%82%BF%E3%83%AA%E3%82%BC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">ポスタリゼーション</a></li><li data-index="8" class="sidebarList_item sidebarList_item__sub"><a href="#%E3%82%B0%E3%83%AA%E3%83%83%E3%83%81%E3%83%8E%E3%82%A4%E3%82%BA%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC">グリッチノイズフィルター</a></li><li data-index="9" class="sidebarList_item sidebarList_item__sub"><a href="#%E3%83%89%E3%83%83%E3%83%88%E7%B5%B5%E9%A2%A8%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC">ドット絵風フィルター</a></li><li data-index="10" class="sidebarList_item sidebarList_item__sub"><a href="#%E6%96%B0%E8%81%9E%E3%81%AE%E5%86%99%E7%9C%9F%E9%A2%A8%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC">新聞の写真風フィルター</a></li><li data-index="11" class="sidebarList_item sidebarList_item__sub"><a href="#%E3%82%B0%E3%83%A9%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%83%83%E3%83%97%E3%81%A8%E3%82%B9%E3%83%88%E3%83%A9%E3%82%A4%E3%83%97%E3%81%AA%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC">グラデーションマップとストライプなフィルター</a></li><li data-index="12" class="sidebarList_item"><a href="#%E3%81%8A%E3%81%BE%E3%81%91%E6%A4%9C%E8%A8%BC">おまけ検証</a></li><li data-index="13" class="sidebarList_item sidebarList_item__sub"><a href="#%E5%A4%96%E9%83%A8svg%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">外部SVGリソースについて</a></li><li data-index="14" class="sidebarList_item sidebarList_item__sub"><a href="#video%E3%82%BF%E3%82%B0%E3%81%B8%E3%81%AE%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E9%81%A9%E7%94%A8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">videoタグへのフィルター適用について</a></li><li data-index="15" class="sidebarList_item sidebarList_item__sub"><a href="#%E3%81%9D%E3%81%AE%E3%81%BB%E3%81%8B%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E9%81%A9%E7%94%A8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">そのほかフィルター適用について</a></li><li data-index="16" class="sidebarList_item"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></li><li data-index="17" class="sidebarList_item sidebarList_item__sub"><a href="#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88">参考サイト</a></li><!--]--></ol></div></div></div></article></main><div class="wrap_960" data-v-da421125><div class="SnsButtons" data-v-da421125 data-v-b5cbd36c><p class="SnsButtons-head" data-v-b5cbd36c>\ SNSでシェアしよう /</p><div class="SnsButtons-sns" data-v-b5cbd36c><a href="https://twitter.com/intent/tweet?url=https://ics.media/entry/241122/&text=%E3%82%B3%E3%83%94%E3%83%9AOK%EF%BC%81%20SVG%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E7%94%BB%E5%83%8F%E5%8A%A0%E5%B7%A5%E3%81%AE%E4%BD%9C%E4%BE%8B%E9%9B%86%20-%20ICS%20MEDIA" target="_blank" class="btn btn-secondary btn-sm share-x" data-v-b5cbd36c><span data-v-b5cbd36c>X(旧Twitter)でポストする</span></a><a href="https://b.hatena.ne.jp/entry/s/ics.media/entry/241122/" target="_blank" class="btn btn-secondary btn-sm share-facebook" data-v-b5cbd36c><span data-v-b5cbd36c>はてなブックマーク</span></a></div></div><div class="author-info" data-v-da421125 style="--475ed944:staff-sawada;" data-v-9742c4dd><div class="author-avatar" data-v-9742c4dd><img src="/_assets/top/staff/ics-staff-sawada.jpg" width="64" height="64" alt="" loading="lazy" data-v-9742c4dd></div><div class="author-desc" data-v-9742c4dd><div class="author-desc-name" data-v-9742c4dd><div data-v-9742c4dd>澤田 悠</div><div data-v-9742c4dd><!----></div></div><p class="author-desc-script" data-v-9742c4dd>フロントエンドエンジニア。大学はデザイン専攻だったもののコードから作りたくてICSへ。趣味は、お絵描き・CG・美術館巡りです。</p><a href="/entry/staff/sawada/" class="btn btn-secondary" data-v-9742c4dd> この担当の記事一覧 </a></div></div></div><aside class="wrap_960 banners" data-v-da421125 data-v-84d78e6a><ul data-v-84d78e6a><li data-v-84d78e6a><a href="/entry/231120/" data-v-84d78e6a><img width="1200" height="640" class="banner-img" alt="バナー:フロントエンドの知識地図" src="/_assets/top/231120_book_banner.jpg" loading="lazy" data-v-84d78e6a></a></li><li data-v-84d78e6a><a href="https://ics-web.jp/recruit/" data-v-84d78e6a><img width="1200" height="640" class="banner-img" alt="バナー:株式会社ICS 採用サイト" src="/_assets/top/190207_recruit_banner.jpg" loading="lazy" data-v-84d78e6a></a></li></ul></aside><aside class="related" data-v-da421125 data-v-c7eaaedb><div class="related-in" data-v-c7eaaedb><h3 class="related-in-head" data-v-c7eaaedb>よく一緒に読まれている記事</h3><ul class="related-in-ul" data-v-c7eaaedb><!--[--><li data-v-c7eaaedb><a href="/entry/200520/" class="" data-v-c7eaaedb><p class="related-in-ul-li-thumb" data-v-c7eaaedb><img class="related-in-ul-li-thumb-img" src="/entry/200520/images/eyecatch__480.png" alt width="1280" height="512" loading="lazy" style="" data-v-c7eaaedb></p><p class="related-in-ul-li-title" data-v-c7eaaedb>君は使い分けられるか?CSS/SVG/Canvasのビジュアル表現でできること・できないこと</p></a></li><li data-v-c7eaaedb><a href="/entry/5535/" class="" data-v-c7eaaedb><p class="related-in-ul-li-thumb" data-v-c7eaaedb><img class="related-in-ul-li-thumb-img" src="/entry/5535/images/eyecatch__480.png" alt width="1280" height="512" loading="lazy" style="" data-v-c7eaaedb></p><p class="related-in-ul-li-title" data-v-c7eaaedb>WebGLのシェーダーGLSLでの画像処理の作り方</p></a></li><li data-v-c7eaaedb><a href="/entry/15393/" class="" data-v-c7eaaedb><p class="related-in-ul-li-thumb" data-v-c7eaaedb><img class="related-in-ul-li-thumb-img" src="/entry/15393/images/eyecatch__480.png" alt width="1280" height="512" loading="lazy" style="" data-v-c7eaaedb></p><p class="related-in-ul-li-title" data-v-c7eaaedb>CSS Filtersでいい感じのマウスオーバー演出</p></a></li><li data-v-c7eaaedb><a href="/entry/230119/" class="" data-v-c7eaaedb><p class="related-in-ul-li-thumb" data-v-c7eaaedb><img class="related-in-ul-li-thumb-img" src="/entry/230119/images/eyecatch__480.png" alt width="1280" height="512" loading="lazy" style="" data-v-c7eaaedb></p><p class="related-in-ul-li-title" data-v-c7eaaedb>制作事例:Lottieのアニメーションを手描き風に動かしたい!SVGとWebGLを使った2つのアプローチ</p></a></li><li data-v-c7eaaedb><a href="/entry/7258/" class="" data-v-c7eaaedb><p class="related-in-ul-li-thumb" data-v-c7eaaedb><img class="related-in-ul-li-thumb-img" src="/entry/7258/images/eyecatch__480.jpg" alt width="1280" height="512" loading="lazy" style="" data-v-c7eaaedb></p><p class="related-in-ul-li-title" data-v-c7eaaedb>CSSのブレンドモードmix-blend-modeを使いこなそう</p></a></li><li data-v-c7eaaedb><a href="/entry/200212/" class="" data-v-c7eaaedb><p class="related-in-ul-li-thumb" data-v-c7eaaedb><img class="related-in-ul-li-thumb-img" src="/entry/200212/images/eyecatch__480.jpg" alt width="1280" height="512" loading="lazy" style="" data-v-c7eaaedb></p><p class="related-in-ul-li-title" data-v-c7eaaedb>1歩踏み込んでみる! CSSグラデーションのマニアックな世界</p></a></li><li data-v-c7eaaedb><a href="/entry/210701/" class="" data-v-c7eaaedb><p class="related-in-ul-li-thumb" data-v-c7eaaedb><img class="related-in-ul-li-thumb-img" src="/entry/210701/images/eyecatch__480.png" alt width="1280" height="512" loading="lazy" style="" data-v-c7eaaedb></p><p class="related-in-ul-li-title" data-v-c7eaaedb>変幻自在なグラフィック表現!CSS, SVG, Canvasでマスクを使いこなせ</p></a></li><li data-v-c7eaaedb><a href="/entry/15970/" class="" data-v-c7eaaedb><p class="related-in-ul-li-thumb" data-v-c7eaaedb><img class="related-in-ul-li-thumb-img" src="/entry/15970/images/eyecatch__480.png" alt width="1280" height="512" loading="lazy" style="" data-v-c7eaaedb></p><p class="related-in-ul-li-title" data-v-c7eaaedb>SVGアニメーションの作り方まとめ</p></a></li><!--]--></ul></div></aside><div class="top_link" data-v-da421125><a href="/" class="btn btn-primary" data-v-da421125>トップページに戻る</a></div><div class="header-breadcrumb" data-v-da421125 data-v-b934bba3><div class="header-breadcrumb__inner" data-v-b934bba3><ul itemscope itemtype="http://schema.org/BreadcrumbList" data-v-b934bba3><!--[--><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem" data-v-b934bba3><a href="/" class="" itemprop="item" data-v-b934bba3><span itemprop="name" data-v-b934bba3>ICS MEDIA</span><meta itemprop="position" content="1" data-v-b934bba3></a></li><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem" data-v-b934bba3><a href="/entry/category/creative/" class="" itemprop="item" data-v-b934bba3><span itemprop="name" data-v-b934bba3>クリエイティブコーダー</span><meta itemprop="position" content="2" data-v-b934bba3></a></li><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem" data-v-b934bba3><a aria-current="page" href="/entry/241122/" class="router-link-active router-link-exact-active" itemprop="item" data-v-b934bba3><span itemprop="name" data-v-b934bba3>コピペOK! SVGフィルターを使った画像加工の作例集</span><meta itemprop="position" content="3" data-v-b934bba3></a></li><!--]--></ul></div></div></div><!--]--><footer class="site_info" data-v-53af800e data-v-63cb43db><div class="site_info-sections" data-v-63cb43db><div class="site_info-sections_item" data-v-63cb43db><h3 data-v-63cb43db>このサイトについて</h3><p data-v-63cb43db><ruby data-v-63cb43db>ICS MEDIA<rt data-v-63cb43db>アイシーエス メディア</rt></ruby>は株式会社<ruby data-v-63cb43db>ICS<rt data-v-63cb43db>アイシーエス</rt></ruby>が運営する<strong title="ICS MEDIAはブログではありません" data-v-63cb43db>オウンドメディア</strong>です。UIデザインやフロントエンドのノウハウや最新技術を掲載しています。UIデザインやフロントエンドのノウハウや最新技術を週1回のペースで掲載しています。 </p><ul data-v-63cb43db><li data-v-63cb43db><a href="/entry/about/" class="" data-v-63cb43db>About</a></li><li data-v-63cb43db><a href="https://docs.google.com/forms/d/e/1FAIpQLSdxYknUt8noNJjuuxAIFgnyNL13XpL4MuwQoOrU_inUz8MhGg/viewform?usp=sf_link" target="_blank" data-v-63cb43db> 記事に関するお問い合わせ </a></li></ul></div><div class="site_info-sections_item" data-v-63cb43db><h3 data-v-63cb43db>運営会社について</h3><p data-v-63cb43db> ICSはインタラクションデザイン専門のウェブ制作会社。最先端のウェブテクノロジーを駆使し、オンスクリーンメディアの表現分野で活動しています。 </p><ul data-v-63cb43db><li data-v-63cb43db><a href="https://ics-web.jp/" target="_blank" data-v-63cb43db> 会社サイト </a></li><li data-v-63cb43db><a href="https://ics-web.jp/contact/" target="_blank" data-v-63cb43db> 会社へのお問い合わせ<br class="tablet" data-v-63cb43db>(仕事の相談等) </a></li></ul><p data-v-63cb43db> インタラクションコンテンツの制作に挑戦しながら、互いにスキルを高め合えるスタッフをICSでは募集しています。 </p><ul data-v-63cb43db><li data-v-63cb43db><a href="https://ics-web.jp/recruit/" rel="noopener noreferrer" data-v-63cb43db>採用情報について</a></li></ul></div><div class="site_info-sections_item" data-v-63cb43db><h3 data-v-63cb43db>常に鮮度の高い情報を</h3><p data-v-63cb43db> ICS MEDIAは古い記事でもメンテナンスし続けることで、常に役立つ情報発信を目指しています。 </p><ul data-v-63cb43db><li data-v-63cb43db><a href="/entry/all/" class="" data-v-63cb43db> すべての記事 </a></li><li data-v-63cb43db><a href="/feed/atom.xml" target="_blank" title="ICS MEDIAのRSSをリーダーに登録しよう" data-v-63cb43db> RSS </a></li><li data-v-63cb43db><a href="https://x.com/icsweb" target="_blank" title="ICSのXをフォローしよう" data-v-63cb43db> Xアカウント </a></li></ul></div></div><div class="copyright" role="contentinfo" data-v-63cb43db data-v-4b34f398> Copyright © 2025 <span itemScope="" itemProp="publisher" itemType="https://schema.org/Organization" data-v-4b34f398> ICS INC. </span><br class="mobile" data-v-4b34f398> All Rights Reserved. <br data-v-4b34f398><span class="raw-pages" data-v-4b34f398><div class="raw-pages-item" data-v-4b34f398><a href="/entry/copyright/" class="" data-v-4b34f398>利用規約・免責・著作権</a></div><div class="raw-pages-item" data-v-4b34f398><a href="/entry/privacy/" class="" data-v-4b34f398>プライバシーポリシー</a></div><div class="raw-pages-item" data-v-4b34f398><a href="/entry/quality/" class="" data-v-4b34f398>品質への取り組み</a></div></span></div></footer></div></div><div id="teleports"></div><script type="application/json" id="__NUXT_DATA__" data-ssr="true">[["ShallowReactive",1],{"data":2,"state":4,"once":6,"_errors":7,"serverRendered":9,"path":10,"prerenderedAt":11,"pinia":12},["ShallowReactive",3],{},["Reactive",5],{},["Set"],["ShallowReactive",8],{},true,"/entry/241122/",1742387292739,["Reactive",13],{"page":14,"transition":20},{"id":15,"title":16,"type":17,"line":18,"useHero":19},"creative","","top","category",false,{"current":16}]</script> <script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/",buildId:"f4489ba0-ed67-46ca-84ab-195a96e59dfb",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script></body></html>