php画像縮小したら黒い枠線が表示されるようになって困った
※仕事関係ネタです。
ブログシステムを作ってる時にブチ当たった問題。
ブログに載せる写真をアップロードし写真を縮小する処理で、何故か縮小された写真に黒い枠線がつくようになった((((;゚Д゚))))
なんだべこれ? 縮小部分のコードは既存のブログシステムを流用してる。いくつかのブログで同じコードを使っているけど、こんな黒線見たこと無い・・・なんだべ?
「php 画像縮小 黒枠」とかでググっても同じ問題はまったく見つからず(´・ω・`)
画像アップロード~縮小~向き変えのあたりをざっと眺めてみる。心当たりといえばPEL: PHP Exif Libraryあたりかな?PHPでEXIFを読みこむライブラリ。これがバージョンアップした影響?ん、、でも、EXIF読んでるだけだし関係ないか・・・・PHP自体のバージョンかな? 問題が起きてるサーバーは去年暮れに契約したロリポップのサーバー。PHPのバージョンが今までオレが使っているやつより新しいのは間違いない。
ステップごとに調査していくとPELは無罪。ImageCreateFromJpegとかimagecopyresampledの仕様が変わったのかな?って調べたけど、そーでも無い。
で、ついに犯人を特定。問題を起こしてるのはimagerotateでした。imagerotateがらみで検索したら毎度お世話になっているStack overflowのBBSにて同じ問題で悩んている人が見つかった。
PHP - Rotate image with GD gives black borders - Stack Overflow
が、答えは載って無くて解決できず(´・ω・`)
imagerotateは写真を斜め45度に回転したとき、画像がない部分は「黒」になるらしい。下図のイメージですね。
きっとこの「黒」が原因に違いない。45度の回転はしてないけど、なぜか1ピクセルの黒い枠線ができるバグがあるに違いない。(GDはバグが多い印象)。
ってことで、いろいろ調べて解決しました。
imagerotateのマニュアルでは↓になってます。3つ目のパラメーターに背景色ってのがあります。
imagerotate ( resource $image
, float $angle
, int $bgd_color
[, int $ignore_transparent
= 0 ] )
今までのコードは imagerotate($source, 0, 0)っていう風に背景色を0にしてて問題なかった(枠線は無かった)。けど、PHPのバージョンアップだかGDのバージョンかなんかの影響でこのバグが発生したみたい
imagerotate($source, 0, 255)ってやれば白い枠線で書いてくれると期待したけどダメw
結局は以下のようにimagecolorallocateを一つ噛ませてimagecolorallocateのRGBに255,255,255をセット。それをimagerotateへ渡してやったら成功しました。
$source = imagecreatefromjpeg($img_path);
$border_color = imagecolorallocate($source, 255, 255, 255);
カテゴリ:PC・スマホ・WEBネタ