2015年2月17日(火)
GDライブラリ(PHP) #■子猫の手 『子猫の手』で、写真登録の際に、長辺240ピクセルのサムネールを作成している。昨日のパソコン教室で、登録できない写真があったので、急遽調べることにした。
結果的には、画像サイズが大き過ぎたのが、原因であった。デジカメなど機器が良くなり過ぎるのも、考え物である。
アップロードサイズの上限は、10MBにしているので、問題ない。
画像編集のGDライブラリの設定は、下記の通りで、特に問題ない。
--
GD Support enabled
GD Version bundled (2.0.28 compatible)
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.2.1
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled
--
ということは、GDライブラリにおいて、ファイルサイズまたは画像サイズの制限に引っ掛かっているということか。インターネット検索するも、的を得た回答が得られなかったが、利用できるメモリで制限されていることは明らかである。
となれば、自分のサーバでコチコチと調べるしかない。あるJPEGファイルを画像サイズ拡大して、問題になる関数の挙動を観察した。
imagecreatefromjpeg()
imagecopyresized()
imagejpeg()
○4239x3146 1270825B(高画質80%)
○4239x3146 2217682B(最高画質100%)
○3145x4238 1292489B(高画質80%)
△3146x4239 1293209B(高画質80%)
※imagecreatefromjpegのみできる時もある。
△4239x3147 1271020B
※imagecreatefromjpegのみできる時もある。
×4239x3148 1269369B
△4240x3147 1271238B
※imagecreatefromjpegのみできる時もある。
×4241x3148 1270864B
正常が再現性ある総ドット数
3145x4238=13,328,510ドット
余裕をみて、4:3画像で長辺4200pxとした場合
4200x3150=13,230,000ドット
ファイルサイズは、問題になっていないと考えられる。画像サイズが、問題となっている。縦長の画像の方がメモリーが必要なようである。総ドット数が13,230,000以下であれば、自分のサーバでは、大丈夫そうだ。
GIFファイルは、アップロードできるファイルサイズ内では、問題なさそうだ。まあ、こんなに大きなGIFファイルは、使わないだろうけどね。
imagecreatefromgif()
imagecopyresized()
imagegif()
〇6500x4824 9830904B
PNGファイルも調査した。
imagecreatefrompng()
imagecopyresized()
imagepng()
【PNG-8(256色、透明可)の場合】
〇5472x4061 2427902B
×5473x4062 2477996B
〇4058x5468 2698399B
×4059x5469 2680481B
余裕をみて、
5400×4050=21,870,000画素
【PNG-24(フルカラー、透明不可)の場合】
○3352x2488 2863244B
×3353x2489 2864288B
○2487x3351 2923310B
×2488x3352 2931771B
余裕をみて
3300×2475=8,167,500画素
さて、問題になる大きさの画像がアップロードされた場合、蹴るのは簡単である。サーバでもっとメモリーを使えるようにグレードアップすれば良いだけだが、急激に費用が嵩むので、現サーバ環境での運用でご了承願いたい。
P.S. 大きな画像は、実際のところ、長辺1920ピクセルに縮小して、準オリジナルファイルとして登録しようか。
P.S.1-2 この作業にもメモリーが必要で、結果的に準オリジナルファイルを作成せず、JPEGファイルでは1200万画素を登録できる最大とした。
P.S.2 ちなみに、PNG-32は、フルカラー、透明可である。