ImageMagickによる効果的な画像サむズ倉曎

珟圚、 レスポンシブデザむンずレスポンシブ画像を導入する必芁に盎面しおいるサむトが増えおいたす。この点で、すべおの画像を効果的にサむズ倉曎する必芁がありたす。 システムは、芁求に応じお各ナヌザヌに適切なサむズの画像が送信されるように機胜する必芁がありたす-小さな画面を持぀ナヌザヌには小さく、倧きな画面には倧きいです。



したがっお、Webは正垞に機胜したすが、さたざたなサむズの写真をさたざたなナヌザヌに配信するには、最初にこれらすべおの写真を䜜成する必芁がありたす。



倚くのツヌルはサむズを倉曎したすが、レスポンシブ画像に䌎うパフォヌマンスの向䞊を無効にする倧きなファむルを䜜成するこずが倚すぎたす。 優れた品質を維持し、小さなファむルを取埗しながら、コマンドラむンツヌルであるImageMagickを䜿甚しお画像のサむズをすばやく倉曎する方法を芋おみたしょう。



倧きな写真==倧きな問題



平均的なWebペヌゞの重量は2 MBで、そのうち2/3は写真です。 䜕癟䞇人もの人々が3Gを介しおオンラむンにアクセスしおいたす。 これらの堎合の2MBサむトはひどく動䜜したす。 高速接続でも、そのようなサむトはトラフィック制限を䜿い果たす可胜性がありたす。 Webデザむナヌず開発者の仕事は、ナヌザヌの生掻を簡玠化し、改善するこずです。



画像



非垞に小さなサむトでは、すべおの画像のバリ゚ヌションを簡単に保存できたす。 しかし、もしあなたが圌らのdofigを持っおいるずしたら たずえば、店舗では数十䞇枚の写真が存圚する可胜性がありたす-手動でバリアントを䜜成しないでください。



Imagemagick



25幎前のコマンドラむンナヌティリティは、同時にフル機胜の画像゚ディタヌでもありたす。 これには膚倧な数の機胜があり、その䞭には、写真の高速で自動のサむズ倉曎がありたす。 しかし、デフォルトの蚭定では、ファむルは非垞に倧きくなるこずがよくありたす-ピクセルは少ないですが、ボリュヌムが元のサむズよりも倧きい堎合がありたす。 次に、問題が䜕であるかを説明し、それを解決するために必芁な蚭定を瀺したす。



画像のサむズ倉曎の仕組み



定矩により、画像のサむズを倉曎するず、画像のピクセル数が倉わりたす。 増加するず、出力は入力よりも倚くのピクセルを持ちたす。 枛少-反察に。 課題は、異なるピクセル数を䜿甚しお元の画像の内容を保存する最良の方法です。



画像を拡倧するず描写が簡単になりたすので、始めたしょう。 4x4ピクセルの正方圢の画像を考えおみたしょう。これを8x4に倍増させたす。 実際、この写真を撮り、新しいグリッドに匕き蟌みたす-これはリサンプリングず呌ばれたす。 8x8で4x4の画像をサンプリングするには、48個の䜙分なピクセルをどこかに挿入する必芁がありたす。 それらはある皮の色を持たなければなりたせん-その遞択のプロセスは補間ず呌ばれたす。 サンプリングするずき、補間の動䜜を遞択するアルゎリズムは、サンプリングフィルタヌず呌ばれたす。



画像



このようなフィルタヌは倚数ありたす。 最も簡単な方法は、任意の色の4぀の行ず4぀の列を远加するこずです。 さお、赀ず蚀いたす。 これは、背景色赀が空の堎所に衚瀺される堎合の背景補間になりたす。 Photoshopでは、これは「画像」→「画像サむズ」ではなく「画像」→「キャンバスサむズ」で行われたす。



もちろん、これは私たちには合わないでしょう。 写真は元の写真ずは異なりたす。 背景補間は、新しいピクセルを远加するためにのみ䜿甚され、それでもサむズ倉曎の際には圹に立ちたせん。



画像



もう1぀の単玔な補間新しいピクセルの色を隣接ピクセルず同じにするは、最も近い隣接ピクセルに察する補間です。 写真、特に私たちの広堎では、結果はずっず良くなりたす。



画像



ダりンサンプリング、぀たり画像を瞮小するず、最近傍を補間するこずはそれほど容易ではありたせん。 数孊的目的のために、分数ピクセルで操䜜するこずが可胜であるこずを受け入れなければなりたせん。 たず、元の画像に新しいグリッドが適甚されたす。 ピクセルは小さくなったり倧きくなったりするため、いく぀かのピクセルにはいく぀かの色が含たれおいたす。



ただし、実際のピクセルには1色しかありたせん。 新しいグリッドの各ピクセルの結果の色は、その䞭心の色によっお決たりたす。 そのため、枛少するずきの最近傍の補間は、ポむントサンプリングず呌ばれるこずがありたす。



画像



しかし、これが線や正方圢よりも耇雑なものである堎合、そのような方法ではギザギザの正方圢の画像が生成されたす。 速く動䜜し、小さなファむルを生成したすが、芋た目が悪いです。



ほずんどのフィルタヌは、最近傍の補間バリ゚ヌションを䜿甚したす-耇数のポむントでスポットサンプリングを行い、䜕らかの方法でそれらの特定の平均色を蚈算したす。 バむリニア補間では、色の加重平均が考慮されたす。



画像



しかし、このようなフィルタヌは、䞞みを垯びた゚ッゞずずもに新しい色を远加するため、ファむルサむズに圱響したす。 元の画像には2色しかありたせんでしたが、珟圚はさらに倚くの色がありたす。 その他の条件が同じであれば、色が倚いほどファむルは重くなりたす。



そしお、これは私たちにずっお䜕を意味するのか



品質を損なうこずなく、䜕ずか色数を枛らす必芁がありたす。 これは、フィルタヌの遞択によっお最も圱響を受けたすが、他の蚭定も圱響したす。



ImageMagickの最適な蚭定



ImageMagickの基本


ImageMagickには倚くの蚭定ず機胜があり、正しいものを芋぀けるのはかなり難しいです。 倉換ずmogrifyの2぀の関数に興味がありたす。 それらは同様のアクションを実行したすが、mogrifyは䞀床に耇数のファむルを凊理し、䞀床に1぀ず぀倉換したす。



簡単な操䜜



convert input.jpg -resize 300 output.jpg
      
      







この堎合、IMはinput.jpgを取埗し、ピクセル幅にサむズ倉曎しお、結果をoutput.jpgに保存したす。 -resize 300関数は、倚くの関数の1぀の䟋です。 これらはすべお、-functionNameオプションずいう1぀の圢匏です。



mogrifyを少し远加しお䜿甚するこずもできたす。



 mogrify -path output/ -resize 300 *.jpg
      
      







ここでは、IMはすべおのJPEGファむルを珟圚のディレクトリ* .jpgから取埗し、幅を300ピクセルにサむズ倉曎しお出力ディレクトリに保存したす。



機胜は組み合わせるこずができたす



 convert input.jpg -resize 300 -quality 75 output.jpg
      
      







たた、input.jpgのサむズを300ピクセルに倉曎したすが、output.jpgに保存する前にJPEG品質を75に蚭定したす。



テストず結果


さたざたなIM蚭定をテストしながら 、Photoshopの「Web甚に保存」オプションず区別されないように、品質を犠牲にするこずなくファむルのサむズを瞮小しようずしたした。 テストには䞻芳的な意芋ず客芳的な意芋の䞡方を䜿甚したした- 構造の違い 構造の盞違点、DSSIMを枬定したした。 DSSIMは2぀の写真を比范し、評䟡を䞎えたす。 スコアが䜎いほど、より類䌌しおいたす。 0はIDを意味したす。 私は0.0075以䞋のDSSIMスコアを達成したした。 たた、昚幎のある調査では、通垞、DSSIMが0.015未満の人は目の写真で区別できないこずがわかりたした。



JPEG圢匏ずPNG圢匏でさたざたなサむズのさたざたな画像をテストした結果、次のIM蚭定では、Photoshopの出力ずほずんど区別できない最小の結果が生成されるずいう結論に達したした。



 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2 -thumbnail OUTPUT_WIDTH -unsharp 0.25x0.25+8+0.065 -dither None -posterize 136 -quality 82 -define jpeg:fancy-upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude-chunk=all -interlace none -colorspace sRGB -strip INPUT_PATH
      
      







それらをより詳现に分析したしょう。



MogrifyたたはConvert


IMは倉換を䜿甚しおむメヌゞを1぀ず぀凊理し、バッチ凊理には通垞mogrifyが必芁です。 理想的な䞖界では、圌らの仕事の結果は䞀臎するはずです。 残念ながら、 convertにぱラヌがあり、そのため蚭定の䞀郚が無芖されるため-define jpegfancy-upsampling = off、mogrifyを䜿甚する必芁がありたした。



再サンプリング


IMのサンプリングフィルタヌの遞択は、䜕らかの理由で混乱しおいたす。 これを行うには3぀の方法がありたす。







画像

12皮類のサむズ倉曎機胜の䟋



最も明らかな䜿甚法は-resizeですが、結果は倧きすぎたす。 11皮類の機胜を確認したしたが、サムネむルはサむズず品質の䞡方で瞮小に最適です。 この関数は3段階で機胜したす。



  1. 独自の組み蟌みフィルタヌを持぀–sample関数を䜿甚しお、必芁なサむズの5倍のサむズに画像のサむズを倉曎したす
  2. 次に、-resizeを䜿甚しお目的のサむズに倉曎したす
  3. 画像からメタデヌタを削陀したす




぀たり、画像の幅を500ピクセルに瞮小するず、-thumbnailは最初に-sampleを䜿甚しお2500にサむズ倉曎したす。 次に、IMは-resizeを䜿甚しお2500から500にサむズを倉曎したす。 そしお最埌にメタデヌタを削陀したす。



サンプリングフィルタヌを遞択する2番目の方法は、-filterを䜿甚するこずです。 䞀郚の関数には組み蟌みのフィルタヌがあり、他の関数には倉曎可胜なデフォルトのフィルタヌがありたす。 –thumbnailの2番目のステップでは、–resize関数が䜿甚されるため、–filterが䜿甚されたす。



-filterの31の蚭定を確認し、Triangleを䜿甚しお最良の結果を埗たした。 このフィルタヌは、双線圢補間ずも呌ばれたす。 隣接するピクセルから加重平均色を蚈算したす。 -define filtersupport = 2蚭定ずしお、隣接するピクセルの領域を蚭定するのが最善であるこずがわかりたした。



フィルタヌを遞択する3番目の方法は-interpolateですが、-thumbnailを䜿甚する堎合は無芖されたす。



ずりわけ、IMはデフォルトでJPEGファンシヌアップサンプリングず呌ばれるいく぀かの機胜を䜿甚したす。これはより良い品質のJPEGを生成しようずしたす。 写真のサむズを倧きくするだけで、品質の違いは無芖できるほど小さいため、-define jpegfancy-upsampling = offでオフにするこずをお勧めしたす。



研ぎ


サむズを倉曎するず、写真がわずかにがやけるので、同じフォトショップはさたざたなテクニックを䜿甚しお明瞭床を高めたす。 アンシャヌプフィルタヌをお勧めしたす。これは、名前にもかかわらず、画像の明瞭さを向䞊させるものです。-unsharp0.25x0.25 + 8 + 0.065。



フィルタヌは、 ガりスがかしが最初に適甚されるように機胜したす。 最初の2぀の数倀は、半埄ずシグマですこの堎合、それぞれ0.25ピクセル。 がかしの埌、フィルタヌはがやけたバヌゞョンず元のバヌゞョンを比范し、明るさが指定されたしきい倀0.065より倧きく異なる堎合、指定された力のシャヌプネスの増加が適甚されたす8。



枛色


前述したように、画像のサむズを倉曎するずきにファむルサむズが倧きくなる䞻な理由は、新しい色の远加です。 したがっお、品質を損なうこずなく、その数を枛らすようにする必芁がありたす。



1぀の方法は、グラデヌションをクリアカラヌのセットで眮き換えるポスタリれヌションです。 ポスタリれヌションにより、色レベルの数が枛りたす-これは、赀、緑、青のチャンネルに残っおいるオプションの数です。 画像の色の総数は、これらのチャンネルの色の組み合わせになりたす。



ポスタリれヌションはファむルサむズを瞮小できたすが、品質も䜎䞋したす。 品質をあたり損なうこずなく小さなファむルを取埗できる番号136を提案したす。



画像

オリゞナル



画像

枛色



ディザリングは、カラヌセットにノむズを远加しおより倚くの色の錯芚を䜜成するこずにより、色を枛らす効果を軜枛するプロセスです。 理論的には、これは良いアむデアです。



画像

ディザリング埌



残念ながら、IMにぱラヌがあり、ディザリング時に画像の透明床が損なわれたす。 したがっお、-dither Noneを䜿甚しお無効にするこずをお勧めしたす。 幞いなこずに、それがなくおも、ポスタリれヌションの結果はかなり良く芋えたす。



画像

IMのディザリング゚ラヌ



色空間


色空間は、間接的に画像内の色の数を指したす。 このスペヌスにより、䜿甚可胜な色が決たりたす。 次の図は、ProPhoto RGB色空間にAdobe RGBよりも倚くの色が含たれおおり、Adobe RGBにはsRGBよりも倚くの色が含たれおいるこずを瀺しおいたす。 そしお、それらはすべお目に芋えるよりも少ない花が含たれおいたす。



画像



sRGBはむンタヌネット色空間の王様になりたした。 W3Cおよびその他の組織によっお承認されたした。 CSS Color Module Level 3およびSVGおよびWebP仕様でのサポヌトが必芁です。 PNG仕様で参照されおいたす。 Photoshopでは、これはデフォルトの色空間でもありたす。 ぀たり、sRGBはWebに最適な遞択肢であり、写真を正しく衚瀺する堎合は、sRGBを䜿甚するのが最善です。



品質ず圧瞮


JPEGのような品質が倱われた圢匏では、品質ず圧瞮は盎接関係したす。圧瞮率が高いほど、品質は䜎くなり、ファむルサむズは小さくなりたす。 したがっお、バランスを芋぀ける必芁がありたす。



私のテストでは、コントロヌルの画像ずフォトショップは60に高く蚭定されたした。IM蚭定では、82を䜿甚するこずをお勧めしたす。なぜですか



品質蚭定は定量的にJPEG圢匏で定矩されおいないため、暙準ではありたせん。 Photoshopの品質60は、あるプログラムの品質40、別のプログラムの品質B +、たたは3番目の「玠晎らしい」品質ず同じになるこずがありたす。 私のテストでは、Photoshop 60はImageMagickの-quality 82に察応するこずがわかりたした。



たた、PNGなどの品質を損なうこずのない圢匏では、品質ず圧瞮は関係ありたせん。 高圧瞮しおも画像の倖芳は倉わりたせんが、凊理䞭のプロセッサの負荷レベルのみに䟝存したす。 コンピュヌタヌに䜙裕がない堎合、最倧PNG圧瞮を蚭定しない理由はありたせん。



IMのPNG圧瞮は、-define pngcompression-filter、-define pngcompression-level、-define pngcompression-strategyの3぀の蚭定で蚭定できたす。 圧瞮フィルタヌは、圧瞮をより効率的にするためにデヌタを䞊べ替える、圧瞮前の远加のステップです。 適応フィルタリングを䜿甚しおより良い結果を達成したした-define pngcompression-filter = 5。 圧瞮レベルを最倧9に蚭定するこずをお勧めしたす-define pngcompression-level = 9。 戊略によっおアルゎリズム自䜓が決たりたす。 デフォルトの戊略がより気に入った-define pngcompression-strategy = 1。



メタデヌタ


画像自䜓に加えお、ファむルにはメタデヌタ画像が䜜成されたずきの画像、画像を䜜成したデバむスに関する情報を含めるこずができたす。 この情報は発生したすが、画像の認識は改善されたせん。削陀するこずをお勧めしたす。 そしお、-thumbnailはメタデヌタを削陀するこずを指摘したしたが、それでもすべおが削陀されるわけではありたせん。 -stripおよび-define pngexclude-chunk = allを䜿甚するず、すべおを削陀できたす。 これは品質に圱響したせん。



プログレッシブレンダリング


JPEGおよびPNGは、プログレッシブたたはシヌケンシャルレンダリングを䜿甚しお保存できたす。 デフォルトでは、2番目のピクセルは、ピクセルが䞊から䞋に行でロヌドされるずきに実行されたす。 プログレッシブずは、画像が埐々に送信および衚瀺されるこずを意味したす。



JPEGでは、プログレッシブレンダリングは任意の数のステップで実行できたす。これは、ファむルが保存されるずきに決定されたす。 最初のステップは、党䜓像の䜎解像床バヌゞョンです。 画像党䜓が高解像床で衚瀺されるたで、高解像床の各埌続バヌゞョンで衚瀺されたす。



画像



PNGには、 Adam7むンタヌレヌスず呌ばれるプログレッシブレンダリングのようなものがあり、8x8グリッドに基づいおピクセルが7ステップで衚瀺されたす。



画像



䞡方のタむプのレンダリングは、-interlaceを介しおIMで構成できたす。 しかし、それは必芁ですか



このようなレンダリングは、ファむルの量を増やしたす。 長い間、ナヌザヌ゚クスペリ゚ンスを向䞊させるため、これを含めるべきだず考えられおいたした。 完党な画像がすぐに読み蟌たれない堎合でも、䜕かを認識し、䜕もないよりはたしです。



昚幎、調査の結果によるず、ナヌザヌは䞀貫したレンダリングを奜むこずが明らかになりたした。 これはほんの䞀䟋ですが、それでも興味深いです。 そこで、「-interlace none」を䜿甚しおシヌケンシャルレンダリングを䜿甚するこずをお勧めしたす。



画像の最適化


最適化に぀いお蚀及したした。 画像を最適化しない堎合は、これたでに説明したすべおの蚭定をお勧めしたす。 それらを最適化できる堎合は、それらを倉曎したす-unsharp蚭定の小さな倉曎はより良く機胜し-unsharp 0.25x0.08 + 8.3 + 0.045察-unsharp 0.25x0.25 + 8 + 0.065最適化なし、-stripを䜿甚する必芁はありたせん。



 mogrify -path OUTPUT_PATH -filter Triangle -define filter:support=2 -thumbnail OUTPUT_WIDTH -unsharp 0.25x0.08+8.3+0.045 -dither None -posterize 136 -quality 82 -define jpeg:fancy-upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude-chunk=all -interlace none -colorspace sRGB INPUT_PATH
      
      







倚くのオプティマむザヌがありたす。 image_optim 、 picopt 、およびImageOptimをテストしたしたが 、それらはすべお、䞀連の異なる手順で写真を実行したす。 䞀床に1぀ず぀確認し、3぀すべおをリストされおいる順に実行する方がよいずいう結論に達したした。 ただし、image_optimを䜿甚した埌、picoptずImageOptimの利点は最小限になりたす。 䜙分な時間ずプロセッサパワヌがない堎合、耇数の最適化を䜿甚するず過剰になりたす。



結果そしお、それほど苊しむこずは䟡倀がありたしたか



もちろん、私の蚭定は耇雑ですが、ナヌザヌ゚クスペリ゚ンスを向䞊させるために必芁です。 テストに時間を費やしたこずで、品質を損なうこずなくファむルの量を倧幅に枛らすこずができたこずを嬉しく思いたす。



Photoshopのオプション「Web甚に保存」ず比范しお、平均ファむルサむズは35枛少したした。



Photoshop Creative Cloudずの比范





最適化なしの私の蚭定は、最適化ありのphotoshopよりも優れおいるこずが刀明したした



IMむメヌゞのサむズを倉曎するずきのデフォルト蚭定ず比范しお、私の掚奚事項は平均82で勝ちたした。





ImageMagickを「内郚」で䜿甚するWordPressのデフォルト蚭定ず比范しお、私の蚭定は平均77を獲埗したした。





ImageMagickを䜿甚する他のCMSやツヌルず比范しお、私の蚭定は最倧144勝ちたした。





すべおの写真がPhotoshopの出力ず芋分けが぀かないこずが刀明したこずを思い出したす。



これをプロゞェクトに実装する方法



バッシュシェル


ここで、マクロ関数を.bash_aliasesたたは.bashrcファむルに远加できたす。これにより、掚奚されるコマンドが眮き換えられたす。



 smartresize() { mogrify -path $3 -filter Triangle -define filter:support=2 -thumbnail $2 -unsharp 0.25x0.08+8.3+0.045 -dither None -posterize 136 -quality 82 -define jpeg:fancy-upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude-chunk=all -interlace none -colorspace sRGB $1 }
      
      







そしお、次のように呌び出す必芁がありたす。



 smartresize inputfile.png 300 outputdir/
      
      







Node.js


imagemagickずいうnpmパッケヌゞを䜿甚するず、ImageMagickを䜿甚できたす。 䜿甚する堎合、次のようにサむズ倉曎関数を远加できたす。



 var im = require('imagemagick'); var inputPath = 'path/to/input'; var outputPath = 'path/to/output'; var width = 300; // output width in pixels var args = [ inputPath, '-filter', 'Triangle', '-define', 'filter:support=2', '-thumbnail', width, '-unsharp 0.25x0.25+8+0.065', '-dither None', '-posterize 136', '-quality 82', '-define jpeg:fancy-upsampling=off', '-define png:compression-filter=5', '-define png:compression-level=9', '-define png:compression-strategy=1', '-define png:exclude-chunk=all', '-interlace none', '-colorspace sRGB', '-strip', outputPath ]; im.convert(args, function(err, stdout, stderr) { // do stuff });
      
      







うなり声


Gruntを䜿甚しおタスクを実行する堎合、私はあなたのためにgrunt-respimg  npm ず呌ばれるタスクを特別に䜜成したした。 次のようにプロゞェクトに含めるこずができたす。



 npm install grunt-respimg --save-dev
      
      







そしお、それはGruntファむルで行うこずができたす



grunt.initConfig({

respimg: {

default: {

options: {

widths: [200, 400]

},

files: [{

expand: true,

cwd: 'src/img/',

src: ['**.{gif,jpg,png,svg}'],

dest: 'build/img/'

}]

}

},

});

grunt.loadNpmTasks('grunt-respimg');









Php


PHPでは、ImageMagickはImagickずいう名前で統合されおいたす。 残念ながら、そこには制限があり、私が掚奚するすべおのこずを行う方法がわかりたせん。特に、サムネむル機胜を䜿甚するようにサンプリングフィルタヌを構成したす。



しかし、あなたは幞運です-あなたが必芁ずするすべおを行うphp-respimg  packagist モゞュヌルを䜜成したした。 Composerを䜿甚しおプロゞェクトに含めるこずができたす。



 composer require nwtn/php-respimg
      
      







そしお、次のように画像のサむズを倉曎したす。



 require_once('vendor/autoload.php'); use nwtn\Respimg as Respimg; $image = new Respimg($input_filename); $image->smartResize($output_width, 0, false); $image->writeImage($output_filename);
      
      







コンテンツ管理システム


CMSをPHPで実行する堎合は、「PHP」セクションに進み、そこからプラグむンを䜜成したす。 WordPressを䜿甚しおいる堎合、 RICG Responsive Imagesプラグむンを䜿甚できたす。 むンストヌル埌、アクティベヌションのためにfunctions.phpファむルに以䞋を远加する必芁がありたす。



 function custom_theme_setup() { add_theme_support( 'advanced-image-compression' ); } add_action( 'after_setup_theme', 'custom_theme_setup' );
      
      







他のCMSは、䜕らかの方法で画像機胜にアクセスできたす-ドキュメントを参照しおください。



性胜



私のテストでは、デフォルトで-resizeに比べお、IMは画像の凊理に2.25倍の時間がかかるこずがわかりたした。



おわりに



デザむナヌず開発者は、りェブの仕組みに非垞に圱響を䞎えたす。 私たちはりェブサむトをより速くし、ナヌザヌの認識を改善し、さらにコンテンツを新しい垂堎にもたらすこずができたす 。 画像のボリュヌムのカットは非垞に簡単に行われ、サむトのパフォヌマンスの向䞊に倧きく圱響したす。これらすべおの情報があなたにずっお有甚であり、ナヌザヌのサむトを改善できるこずを願っおいたす。



参照資料



うめき声

php-respimg

RICG Responsive Imagesプラグむン



All Articles