[{"data":1,"prerenderedAt":962},["ShallowReactive",2],{"article-wp-batch-image-compress":3},{"id":4,"title":5,"body":6,"category":949,"createdAt":951,"description":952,"extension":953,"index":954,"meta":955,"navigation":138,"path":956,"publish":138,"seo":957,"series":954,"seriesTitle":954,"stem":958,"tag":959,"thumbnail":954,"updatedAt":954,"__hash__":961},"articles\u002Farticles\u002Fwp-batch-image-compress.md","大量の大ファイルサイズ画像をPHPでリサイズ・圧縮をする方法",{"type":7,"value":8,"toc":937},"minimark",[9,13,16,19,23,26,47,50,53,56,283,293,296,301,307,339,348,399,406,410,415,426,429,500,506,509,512,515,898,905,909,916,924,927,933],[10,11,12],"p",{},"こんにちはjunです。私はこの技術ブログ以外にもブログを運営しているのですが、そちらはwebエンジニアになる前からやっていました。しかし過去の記事を見ているとやたらと重い画像、１枚あたり１MBも使っている記事が何枚もありました。当時は画像の重さなど知らずにデジカメの画像をそのままアップロードして、使用していたことが原因です。",[10,14,15],{},"記事の中には転送量が12MBにもなっているものもあり、原因は画像でした。それらの画像はやたらとサイズ（寸法）が大きいことが原因なので、リサイズして圧縮することで解決できます。しかし100件以上の記事を1つずつ開いて調べたり、もう一回ダウンロードして、圧縮してアップロードなんて何日かかるかわかりません。そのため今回はPHPとコマンドラインを用いて一気に画像を処理することにしました。",[10,17,18],{},"wordpressを使用していますが、画像処理のエッセンスや大方の処理の流れは応用できるとおもいます。では早速やっていきましょう。",[20,21,22],"h2",{"id":22},"大まかな流れ",[10,24,25],{},"まず全体の処理の流れですが以下の通りです。",[27,28,29,38,41,44],"ol",{},[30,31,32,33,37],"li",{},"ターミナルで ",[34,35,36],"code",{},"wp-content\u002Fuploads\u002F"," 配下にある大サイズ（500kb以上とする）をリストアップ。",[30,39,40],{},"バックアップしておき、数ヶ月残しておく。",[30,42,43],{},"PHPのGDモジュールを用いてリサイズ・圧縮を行う。",[30,45,46],{},"処理した画像を上書き。",[10,48,49],{},"以上の通りです。今回の処理を行うにあたりwordpressがあるサーバーに対してCLI\b操作が行える必要があります。SSHができ、必要な権限を付与しておいてください。今回はこの準備はできているものとします。",[20,51,52],{"id":52},"処理対象をリストアップ",[10,54,55],{},"それではまず対象の画像をリストアップします。アップロードディレクトリに移動してfindコマンドで簡単に見つけられます。",[57,58,63],"pre",{"className":59,"code":60,"language":61,"meta":62,"style":62},"language-bash shiki shiki-themes material-theme-ocean","# \u002Fdocumentroot\u002Fwordpress\u002F は仮です。あなたの環境に合わせてください。\n# 画像が格納されているuploadsへ移動\ncd '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads'\nls\n2017 2018 2019 2020 2021 aaaa bbbbb cccc\n\n# プラグイン用画像のディレクトリなどもあるので注意！\n# 自分がアップロードした画像があるディレクトリのみを指定、500kb以上のものをリストアップ。リストはテキストファイルとしてホームディレクトリにおいておく。\nfind 2017 2018 2019 2020 2021 -size +500k > ~\u002Flist.txt\n..\n2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-644x279.png\n2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-720x340.png\n2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-768x332.png\n2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83.png\n2017\u002F12\u002FDSC03961-1200x900.jpg\n2017\u002F12\u002FDSC04310-1200x900.jpg\n2017\u002F12\u002FDSC04311-1200x900.jpg\n2017\u002F12\u002FDSC04314-1200x900.jpg\n2017\u002F12\u002FDSC04315-1200x900.jpg\n2017\u002F12\u002FDSC04316-1200x900.jpg\n2017\u002F12\u002FDSC04317-1200x900.jpg\n2017\u002F12\u002FDSC04319-1200x900.jpg\n2017\u002F12\u002FDSC04320-e1512559527929-1200x1600.jpg\n2017\u002F12\u002FDSC04324-1200x900.jpg\n2017\u002F12\u002FDSC04325-1200x900.jpg\n...\n","bash","",[34,64,65,74,80,98,105,133,140,146,152,181,187,193,199,205,211,217,223,229,235,241,247,253,259,265,271,277],{"__ignoreMap":62},[66,67,70],"span",{"class":68,"line":69},"line",1,[66,71,73],{"class":72},"sC9rS","# \u002Fdocumentroot\u002Fwordpress\u002F は仮です。あなたの環境に合わせてください。\n",[66,75,77],{"class":68,"line":76},2,[66,78,79],{"class":72},"# 画像が格納されているuploadsへ移動\n",[66,81,83,87,91,95],{"class":68,"line":82},3,[66,84,86],{"class":85},"sdLwU","cd",[66,88,90],{"class":89},"sAklC"," '",[66,92,94],{"class":93},"sfyAc","\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads",[66,96,97],{"class":89},"'\n",[66,99,101],{"class":68,"line":100},4,[66,102,104],{"class":103},"s5Dmg","ls\n",[66,106,108,111,115,118,121,124,127,130],{"class":68,"line":107},5,[66,109,110],{"class":103},"2017",[66,112,114],{"class":113},"sx098"," 2018",[66,116,117],{"class":113}," 2019",[66,119,120],{"class":113}," 2020",[66,122,123],{"class":113}," 2021",[66,125,126],{"class":93}," aaaa",[66,128,129],{"class":93}," bbbbb",[66,131,132],{"class":93}," cccc\n",[66,134,136],{"class":68,"line":135},6,[66,137,139],{"emptyLinePlaceholder":138},true,"\n",[66,141,143],{"class":68,"line":142},7,[66,144,145],{"class":72},"# プラグイン用画像のディレクトリなどもあるので注意！\n",[66,147,149],{"class":68,"line":148},8,[66,150,151],{"class":72},"# 自分がアップロードした画像があるディレクトリのみを指定、500kb以上のものをリストアップ。リストはテキストファイルとしてホームディレクトリにおいておく。\n",[66,153,155,158,161,163,165,167,169,172,175,178],{"class":68,"line":154},9,[66,156,157],{"class":103},"find",[66,159,160],{"class":113}," 2017",[66,162,114],{"class":113},[66,164,117],{"class":113},[66,166,120],{"class":113},[66,168,123],{"class":113},[66,170,171],{"class":93}," -size",[66,173,174],{"class":93}," +500k",[66,176,177],{"class":89}," >",[66,179,180],{"class":93}," ~\u002Flist.txt\n",[66,182,184],{"class":68,"line":183},10,[66,185,186],{"class":85},"..\n",[66,188,190],{"class":68,"line":189},11,[66,191,192],{"class":103},"2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-644x279.png\n",[66,194,196],{"class":68,"line":195},12,[66,197,198],{"class":103},"2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-720x340.png\n",[66,200,202],{"class":68,"line":201},13,[66,203,204],{"class":103},"2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83-768x332.png\n",[66,206,208],{"class":68,"line":207},14,[66,209,210],{"class":103},"2017\u002F12\u002Fd7d6b39a47612239ce48bf6579be7f83.png\n",[66,212,214],{"class":68,"line":213},15,[66,215,216],{"class":103},"2017\u002F12\u002FDSC03961-1200x900.jpg\n",[66,218,220],{"class":68,"line":219},16,[66,221,222],{"class":103},"2017\u002F12\u002FDSC04310-1200x900.jpg\n",[66,224,226],{"class":68,"line":225},17,[66,227,228],{"class":103},"2017\u002F12\u002FDSC04311-1200x900.jpg\n",[66,230,232],{"class":68,"line":231},18,[66,233,234],{"class":103},"2017\u002F12\u002FDSC04314-1200x900.jpg\n",[66,236,238],{"class":68,"line":237},19,[66,239,240],{"class":103},"2017\u002F12\u002FDSC04315-1200x900.jpg\n",[66,242,244],{"class":68,"line":243},20,[66,245,246],{"class":103},"2017\u002F12\u002FDSC04316-1200x900.jpg\n",[66,248,250],{"class":68,"line":249},21,[66,251,252],{"class":103},"2017\u002F12\u002FDSC04317-1200x900.jpg\n",[66,254,256],{"class":68,"line":255},22,[66,257,258],{"class":103},"2017\u002F12\u002FDSC04319-1200x900.jpg\n",[66,260,262],{"class":68,"line":261},23,[66,263,264],{"class":103},"2017\u002F12\u002FDSC04320-e1512559527929-1200x1600.jpg\n",[66,266,268],{"class":68,"line":267},24,[66,269,270],{"class":103},"2017\u002F12\u002FDSC04324-1200x900.jpg\n",[66,272,274],{"class":68,"line":273},25,[66,275,276],{"class":103},"2017\u002F12\u002FDSC04325-1200x900.jpg\n",[66,278,280],{"class":68,"line":279},26,[66,281,282],{"class":85},"...\n",[10,284,285,288,289,292],{},[34,286,287],{},"find -size "," でファイルサイズでフィルターできます。1000件以上あったりと、コピーするのは大変なので ",[34,290,291],{},"list.txt"," などで出力しておきます。",[20,294,295],{"id":295},"画像処理スクリプトを作成",[297,298,300],"h3",{"id":299},"リストをphp-arrayにする","リストをPHP Arrayにする",[10,302,303,304,306],{},"サーバーでのリストアップが終わったので、ローカルでスクリプトを作っていきます。",[34,305,291],{}," はローカルに移動しておきます。",[57,308,310],{"className":59,"code":309,"language":61,"meta":62,"style":62},".\n├── list.php\n├── image.php\n├── list.txt\n",[34,311,312,317,325,332],{"__ignoreMap":62},[66,313,314],{"class":68,"line":69},[66,315,316],{"class":85},".\n",[66,318,319,322],{"class":68,"line":76},[66,320,321],{"class":103},"├──",[66,323,324],{"class":93}," list.php\n",[66,326,327,329],{"class":68,"line":82},[66,328,321],{"class":103},[66,330,331],{"class":93}," image.php\n",[66,333,334,336],{"class":68,"line":100},[66,335,321],{"class":103},[66,337,338],{"class":93}," list.txt\n",[10,340,341,343,344,347],{},[34,342,291],{}," を",[34,345,346],{},"list.php"," としてコピーしておき、配列に変換しておきます。テキストエディタの置換機能などを利用してください。",[57,349,353],{"className":350,"code":351,"filename":346,"language":352,"meta":62,"style":62},"language-php shiki shiki-themes material-theme-ocean","\u003C?php \n$list =[\n\"2017\u002F06\u002F23c7f697593e4a4c83e01310ee4b84ec-1200x900.jpg\",\n\"2017\u002F06\u002F23c7f697593e4a4c83e01310ee4b84ec.jpg\",\n\"2017\u002F06\u002Fcropped-DSC03989-1-1024x723.jpg\",\n\"2017\u002F06\u002Fcropped-DSC03989-1-1200x847.jpg\",\n\"2017\u002F06\u002Fcropped-DSC03989-1.jpg\",\n...\n];\n","php",[34,354,355,360,365,370,375,380,385,390,394],{"__ignoreMap":62},[66,356,357],{"class":68,"line":69},[66,358,359],{},"\u003C?php \n",[66,361,362],{"class":68,"line":76},[66,363,364],{},"$list =[\n",[66,366,367],{"class":68,"line":82},[66,368,369],{},"\"2017\u002F06\u002F23c7f697593e4a4c83e01310ee4b84ec-1200x900.jpg\",\n",[66,371,372],{"class":68,"line":100},[66,373,374],{},"\"2017\u002F06\u002F23c7f697593e4a4c83e01310ee4b84ec.jpg\",\n",[66,376,377],{"class":68,"line":107},[66,378,379],{},"\"2017\u002F06\u002Fcropped-DSC03989-1-1024x723.jpg\",\n",[66,381,382],{"class":68,"line":135},[66,383,384],{},"\"2017\u002F06\u002Fcropped-DSC03989-1-1200x847.jpg\",\n",[66,386,387],{"class":68,"line":142},[66,388,389],{},"\"2017\u002F06\u002Fcropped-DSC03989-1.jpg\",\n",[66,391,392],{"class":68,"line":148},[66,393,282],{},[66,395,396],{"class":68,"line":154},[66,397,398],{},"];\n",[10,400,401,402,405],{},"これで対象画像をリストアップして、PHPが扱えるようになったので ",[34,403,404],{},"image.php"," にて処理の方を書いていきましょう。",[297,407,409],{"id":408},"画像圧縮リサイズ処理","画像圧縮・リサイズ処理",[411,412,414],"h4",{"id":413},"そのまえに","そのまえに..",[10,416,417,418,425],{},"PHPでリサイズなどの画像処理を行う場合は",[419,420,424],"a",{"href":421,"rel":422},"https:\u002F\u002Fwww.php.net\u002Fmanual\u002Fja\u002Fintro.image.php",[423],"nofollow","GDというPHPモジュール","を用います。処理を書く前にこのGDモジュールが使用しているPHP環境にあるかを確認しましょう。",[10,427,428],{},"phpinfoのページでも確認できますが、手っ取り早くCLIでやりましょう。以下のコマンドを打ちます。",[57,430,432],{"className":59,"code":431,"language":61,"meta":62,"style":62},"php --info | grep GD\nGD Support => enabled\nGD headers Version => 2.3.2\nGD library Version => 2.3.2\n",[34,433,434,450,468,485],{"__ignoreMap":62},[66,435,436,438,441,444,447],{"class":68,"line":69},[66,437,352],{"class":103},[66,439,440],{"class":93}," --info",[66,442,443],{"class":89}," |",[66,445,446],{"class":103}," grep",[66,448,449],{"class":93}," GD\n",[66,451,452,455,458,462,465],{"class":68,"line":76},[66,453,454],{"class":103},"GD",[66,456,457],{"class":93}," Support",[66,459,461],{"class":460},"s0W1g"," =",[66,463,464],{"class":89},">",[66,466,467],{"class":93}," enabled\n",[66,469,470,472,475,478,480,482],{"class":68,"line":82},[66,471,454],{"class":103},[66,473,474],{"class":93}," headers",[66,476,477],{"class":93}," Version",[66,479,461],{"class":460},[66,481,464],{"class":89},[66,483,484],{"class":113}," 2.3.2\n",[66,486,487,489,492,494,496,498],{"class":68,"line":100},[66,488,454],{"class":103},[66,490,491],{"class":93}," library",[66,493,477],{"class":93},[66,495,461],{"class":460},[66,497,464],{"class":89},[66,499,484],{"class":113},[10,501,502,505],{},[34,503,504],{},"GD Support => enabled"," が存在し、enabledとなっていれば使用可能です。ない場合などを別途インストールが必要です。まあwordpressが使用できる環境ならば大抵入っていると思います。これでGDの確認を行ったら、処理を書きます。",[411,507,508],{"id":508},"処理の記述",[10,510,511],{},"今回のスクリプトはCMSがるサーバー上で実行するものとします。そのためパスなどの構成も予め、サーバー上であることを想定してます。",[10,513,514],{},"全体は以下の通りです。",[57,516,518],{"className":350,"code":517,"language":352,"meta":62,"style":62},"\u003C?php \n    require_once 'list.php';\n\n    $uploadRoot = '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads\u002F';\n\n    foreach($list as $file){\n        \u002F** \n         * ファイル名などを分けておく。\n         * \n         * 例\n         * $file            => '2017\u002F12\u002FDSC04325-1200x900.jpg'\n         * $targetFilename  => 'DSC04325-1200x900.jpg'\n         * $fullPath        => '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads\u002F2017\u002F12\u002FDSC04325-1200x900.jpg'\n        *\u002F\n        $filenames = explode('\u002F',$file);\n        $targetFilename = $filenames[count($filenames)-1];\n        $fullPath = $uploadRoot.$file;\n\n        \u002F\u002F getimagesize()を用いて寸法、拡張子の情報を取得。\n        list($w, $h,$type) = getimagesize($fullPath);\n        var_dump($fullPath);\n\n        \u002F\u002F imagecreatefromjpeg()・imagecreatefrompng()にてGDImageを取得。画像を取得しているんだなぐらいだと思ってください。\n        \u002F\u002F JPG\u002FPNGによって分ける必要あり！。\n        switch ($type) {\n            case IMAGETYPE_JPEG:\n                $original_image = imagecreatefromjpeg($fullPath);\n                break;\n            case IMAGETYPE_PNG:\n                $original_image = imagecreatefrompng($fullPath);\n                break;\n            default:\n                var_dump('対応していないファイル形式です。: '.$fullPath);\n                continue;\n        }\n\n        \u002F\u002F 寸法が大きすぎるもの(1000px以上)は600pxぐにらいするリサイズ処理を行う。\n        if($w >= 1000){\n\n            \u002F\u002F imagecreatetruecolor() で新しい画像を埋め込むための「枠」を作る。（新しいキャンバス的な？）\n            \u002F\u002F 縦横比を計算させて元画像と同じにさせること。\n            $newW = 600;\n            $newH = $newW * ($h \u002F $w);\n            $newImg = imagecreatetruecolor($newW, $newH);\n\n            \u002F\u002F リサイズ処理。\n            $success = imagecopyresampled($newImg, $original_image, 0, 0, 0, 0, $newW, $newH, $w, $h);\n\n            if($success){\n                $original_image = $newImg;\n            }else{\n                var_dump('リサイズ失敗: '.$fullPath);\n                continue;\n            }\n        }\n\n        \u002F\u002F 画像を圧縮して同じ名前、パスで上書き保存する。ここも拡張子で異なるので注意！\n        \u002F\u002F 数字は圧縮の品質。低いほど軽くなるが、粗くなる。jpgは0~100,pngは0~9なので注意。\n        switch ($type) {\n            case IMAGETYPE_JPEG:\n                imagejpeg($original_image,$fullPath,60);\n                break;\n            case IMAGETYPE_PNG:\n                imagepng($original_image,$fullPath,6);\n                break;\n            default:\n                var_dump('対応していないファイル形式です。: '.$fullPath);\n                continue;\n        }\n    }\n?>\n",[34,519,520,524,529,533,538,542,547,552,557,562,567,572,577,582,587,592,597,602,606,611,616,621,625,630,635,640,645,651,657,663,669,674,680,686,692,698,703,709,715,720,726,732,738,744,750,755,761,767,772,778,784,790,796,801,807,812,817,823,829,834,839,845,850,855,861,866,871,876,881,886,892],{"__ignoreMap":62},[66,521,522],{"class":68,"line":69},[66,523,359],{},[66,525,526],{"class":68,"line":76},[66,527,528],{},"    require_once 'list.php';\n",[66,530,531],{"class":68,"line":82},[66,532,139],{"emptyLinePlaceholder":138},[66,534,535],{"class":68,"line":100},[66,536,537],{},"    $uploadRoot = '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads\u002F';\n",[66,539,540],{"class":68,"line":107},[66,541,139],{"emptyLinePlaceholder":138},[66,543,544],{"class":68,"line":135},[66,545,546],{},"    foreach($list as $file){\n",[66,548,549],{"class":68,"line":142},[66,550,551],{},"        \u002F** \n",[66,553,554],{"class":68,"line":148},[66,555,556],{},"         * ファイル名などを分けておく。\n",[66,558,559],{"class":68,"line":154},[66,560,561],{},"         * \n",[66,563,564],{"class":68,"line":183},[66,565,566],{},"         * 例\n",[66,568,569],{"class":68,"line":189},[66,570,571],{},"         * $file            => '2017\u002F12\u002FDSC04325-1200x900.jpg'\n",[66,573,574],{"class":68,"line":195},[66,575,576],{},"         * $targetFilename  => 'DSC04325-1200x900.jpg'\n",[66,578,579],{"class":68,"line":201},[66,580,581],{},"         * $fullPath        => '\u002Fdocumentroot\u002Fwordpress\u002Fwp-content\u002Fuploads\u002F2017\u002F12\u002FDSC04325-1200x900.jpg'\n",[66,583,584],{"class":68,"line":207},[66,585,586],{},"        *\u002F\n",[66,588,589],{"class":68,"line":213},[66,590,591],{},"        $filenames = explode('\u002F',$file);\n",[66,593,594],{"class":68,"line":219},[66,595,596],{},"        $targetFilename = $filenames[count($filenames)-1];\n",[66,598,599],{"class":68,"line":225},[66,600,601],{},"        $fullPath = $uploadRoot.$file;\n",[66,603,604],{"class":68,"line":231},[66,605,139],{"emptyLinePlaceholder":138},[66,607,608],{"class":68,"line":237},[66,609,610],{},"        \u002F\u002F getimagesize()を用いて寸法、拡張子の情報を取得。\n",[66,612,613],{"class":68,"line":243},[66,614,615],{},"        list($w, $h,$type) = getimagesize($fullPath);\n",[66,617,618],{"class":68,"line":249},[66,619,620],{},"        var_dump($fullPath);\n",[66,622,623],{"class":68,"line":255},[66,624,139],{"emptyLinePlaceholder":138},[66,626,627],{"class":68,"line":261},[66,628,629],{},"        \u002F\u002F imagecreatefromjpeg()・imagecreatefrompng()にてGDImageを取得。画像を取得しているんだなぐらいだと思ってください。\n",[66,631,632],{"class":68,"line":267},[66,633,634],{},"        \u002F\u002F JPG\u002FPNGによって分ける必要あり！。\n",[66,636,637],{"class":68,"line":273},[66,638,639],{},"        switch ($type) {\n",[66,641,642],{"class":68,"line":279},[66,643,644],{},"            case IMAGETYPE_JPEG:\n",[66,646,648],{"class":68,"line":647},27,[66,649,650],{},"                $original_image = imagecreatefromjpeg($fullPath);\n",[66,652,654],{"class":68,"line":653},28,[66,655,656],{},"                break;\n",[66,658,660],{"class":68,"line":659},29,[66,661,662],{},"            case IMAGETYPE_PNG:\n",[66,664,666],{"class":68,"line":665},30,[66,667,668],{},"                $original_image = imagecreatefrompng($fullPath);\n",[66,670,672],{"class":68,"line":671},31,[66,673,656],{},[66,675,677],{"class":68,"line":676},32,[66,678,679],{},"            default:\n",[66,681,683],{"class":68,"line":682},33,[66,684,685],{},"                var_dump('対応していないファイル形式です。: '.$fullPath);\n",[66,687,689],{"class":68,"line":688},34,[66,690,691],{},"                continue;\n",[66,693,695],{"class":68,"line":694},35,[66,696,697],{},"        }\n",[66,699,701],{"class":68,"line":700},36,[66,702,139],{"emptyLinePlaceholder":138},[66,704,706],{"class":68,"line":705},37,[66,707,708],{},"        \u002F\u002F 寸法が大きすぎるもの(1000px以上)は600pxぐにらいするリサイズ処理を行う。\n",[66,710,712],{"class":68,"line":711},38,[66,713,714],{},"        if($w >= 1000){\n",[66,716,718],{"class":68,"line":717},39,[66,719,139],{"emptyLinePlaceholder":138},[66,721,723],{"class":68,"line":722},40,[66,724,725],{},"            \u002F\u002F imagecreatetruecolor() で新しい画像を埋め込むための「枠」を作る。（新しいキャンバス的な？）\n",[66,727,729],{"class":68,"line":728},41,[66,730,731],{},"            \u002F\u002F 縦横比を計算させて元画像と同じにさせること。\n",[66,733,735],{"class":68,"line":734},42,[66,736,737],{},"            $newW = 600;\n",[66,739,741],{"class":68,"line":740},43,[66,742,743],{},"            $newH = $newW * ($h \u002F $w);\n",[66,745,747],{"class":68,"line":746},44,[66,748,749],{},"            $newImg = imagecreatetruecolor($newW, $newH);\n",[66,751,753],{"class":68,"line":752},45,[66,754,139],{"emptyLinePlaceholder":138},[66,756,758],{"class":68,"line":757},46,[66,759,760],{},"            \u002F\u002F リサイズ処理。\n",[66,762,764],{"class":68,"line":763},47,[66,765,766],{},"            $success = imagecopyresampled($newImg, $original_image, 0, 0, 0, 0, $newW, $newH, $w, $h);\n",[66,768,770],{"class":68,"line":769},48,[66,771,139],{"emptyLinePlaceholder":138},[66,773,775],{"class":68,"line":774},49,[66,776,777],{},"            if($success){\n",[66,779,781],{"class":68,"line":780},50,[66,782,783],{},"                $original_image = $newImg;\n",[66,785,787],{"class":68,"line":786},51,[66,788,789],{},"            }else{\n",[66,791,793],{"class":68,"line":792},52,[66,794,795],{},"                var_dump('リサイズ失敗: '.$fullPath);\n",[66,797,799],{"class":68,"line":798},53,[66,800,691],{},[66,802,804],{"class":68,"line":803},54,[66,805,806],{},"            }\n",[66,808,810],{"class":68,"line":809},55,[66,811,697],{},[66,813,815],{"class":68,"line":814},56,[66,816,139],{"emptyLinePlaceholder":138},[66,818,820],{"class":68,"line":819},57,[66,821,822],{},"        \u002F\u002F 画像を圧縮して同じ名前、パスで上書き保存する。ここも拡張子で異なるので注意！\n",[66,824,826],{"class":68,"line":825},58,[66,827,828],{},"        \u002F\u002F 数字は圧縮の品質。低いほど軽くなるが、粗くなる。jpgは0~100,pngは0~9なので注意。\n",[66,830,832],{"class":68,"line":831},59,[66,833,639],{},[66,835,837],{"class":68,"line":836},60,[66,838,644],{},[66,840,842],{"class":68,"line":841},61,[66,843,844],{},"                imagejpeg($original_image,$fullPath,60);\n",[66,846,848],{"class":68,"line":847},62,[66,849,656],{},[66,851,853],{"class":68,"line":852},63,[66,854,662],{},[66,856,858],{"class":68,"line":857},64,[66,859,860],{},"                imagepng($original_image,$fullPath,6);\n",[66,862,864],{"class":68,"line":863},65,[66,865,656],{},[66,867,869],{"class":68,"line":868},66,[66,870,679],{},[66,872,874],{"class":68,"line":873},67,[66,875,685],{},[66,877,879],{"class":68,"line":878},68,[66,880,691],{},[66,882,884],{"class":68,"line":883},69,[66,885,697],{},[66,887,889],{"class":68,"line":888},70,[66,890,891],{},"    }\n",[66,893,895],{"class":68,"line":894},71,[66,896,897],{},"?>\n",[10,899,900,901,904],{},"書いてあるコメントの通りです。ただGDは拡張子ごとに使用する関数を分ける必要があるので、そこがめんどいです。listで予めどんな拡張子が使用されているかを確かめておきましょう。ローカルでテストを行ったら、",[34,902,903],{},"image.php, list.php","をサーバーに転送します。",[20,906,908],{"id":907},"実行前の注意","実行前の注意！",[10,910,911,912,915],{},"実行する前に必ず ",[34,913,914],{},"uploads"," のバックアップをしておきましょう。そうすればもしやらかしたり、予想以上に粗くなったとしてもやり直しができます。OKであれば",[57,917,922],{"className":918,"code":920,"language":921},[919],"language-text","php image.php\n","text",[34,923,920],{"__ignoreMap":62},[10,925,926],{},"そして実行しましょう。私の場合1500画像で5分ほどで終わった気がします。",[10,928,929,932],{},[34,930,931],{},"ls -lh"," や上記のfindコマンドで重い画像がなくなったかを確認しましょう。また、画像のパスをブラウザで叩いて確認してもいいかもしれません。キャッシュが効いていることが多いので、シークレットモードで見ることをお勧めします。",[934,935,936],"style",{},"html pre.shiki code .sC9rS, html code.shiki .sC9rS{--shiki-default:#464B5D;--shiki-default-font-style:italic}html pre.shiki code .sdLwU, html code.shiki .sdLwU{--shiki-default:#82AAFF}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html pre.shiki code .s5Dmg, html code.shiki .s5Dmg{--shiki-default:#FFCB6B}html pre.shiki code .sx098, html code.shiki .sx098{--shiki-default:#F78C6C}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}",{"title":62,"searchDepth":82,"depth":82,"links":938},[939,940,941,948],{"id":22,"depth":76,"text":22},{"id":52,"depth":76,"text":52},{"id":295,"depth":76,"text":295,"children":942},[943,944],{"id":299,"depth":82,"text":300},{"id":408,"depth":82,"text":409,"children":945},[946,947],{"id":413,"depth":100,"text":414},{"id":508,"depth":100,"text":508},{"id":907,"depth":76,"text":908},[950],"ministack","2021-08-15","wordpressに保存された1〜4MBの1500件の画像を一括に処理する。","md",null,{},"\u002Farticles\u002Fwp-batch-image-compress",{"title":5,"description":952},"articles\u002Fwp-batch-image-compress",[960,352],"wordpress","XoVocS1wgJ1s3OqIpny9hQofVYNRjvOcumKbgZx2d98",1780987147666]