外部サイトにある画像を取得して、拡張子に限らずjpgで保存しようと考えています。実現のための調べ物をしたので、メモがてら記録したいと思います。

ゴールまでの流れ

画像を取得して保存するまでの流れは以下のとおり。

1.画像を取得する
2.取得した画像の形式を判断する
3.サイズを変更しつつ、jpgにて保存する

おおよその流れはこんな感じだと思うので、上記に基づいて実行してみます。

1.画像を取得する

まず、外部の画像を取得します。取得する際に使う関数は、file_get_contentsで、取得したデータを以下の内容で判定します。

$url='http://hogehoge.com/aaaa.jpg'; 
file_get_contents($url);

file_get_contentsで画像がバイナリーで取得できました。この取得できたデータを使って、次は画像の拡張子というか形式を判定します。

ただ、このfile_get_contents、取得できなかった場合の分岐がないと色々問題なので、ちょっと追加して変更しておきます。

$context = stream_context_create(array(
    'http' => array('ignore_errors' => true)
));

$url='http://hogehoge.com/aaaa.jpg'; 

$img_data=file_get_contents($url,false,$context);
///status codeに200が含まれてるかチェック
$pos = strpos($http_response_header[0], '200');
if ($pos === false) {
///200じゃなかった場合の処理。画像が取得できなかった場合の処理を記録
}

2.取得した画像の形式を判断する

file_get_contentsだけでは、データを取得しただけですので、このデータにfinfoを使って、mime_typeを…と思いましたが、加工の際に元画像の大きさなどが必要になってくるかもしれませんので、バイナリファイルを使って、mime_typeとファイルの大きさを同時に取得したいと思います。

$context = stream_context_create(array(
    'http' => array('ignore_errors' => true)
));

$url='http://hogehoge.com/aaaa.jpg'; 
$img_data=file_get_contents($url,false,$context);
$scheme='data:application/octet-stream;base64,';
$image_size=getimagesize($scheme . base64_encode($img_data));
var_dump($image_size);


///実行結果
array(7) {
  [0]=>
  int(1200)
  [1]=>
  int(630)
  [2]=>
  int(2)
  [3]=>
  string(25) "width="1200" height="630""
  ["bits"]=>
  int(8)
  ["channels"]=>
  int(3)
  ["mime"]=>
  string(10) "image/jpeg"
}

これでバイナリを取得した状態で、mime_typeもwidth、heightも取得できています。配列の中のmimeが画像の形式になりますので、今回の例ではjpgです。画像の拡張子別のmime typeは以下のとおりです。

gif … image/gif
png … image/png
jpg … image/jpeg
bmp … image/bmp

で、画像の形式によっては、画像の処理の方法が変わるので、以下のように分岐をしてみます。

///前回の$image_sizeの作成した後の続き

switch($image_size["mime"]){
case 'image/gif':
$original_image = imagecreatefromgif($scheme . base64_encode($img_data));
break;

case 'image/jpeg':
$original_image = imagecreatefromjpeg($scheme . base64_encode($img_data));
break;

case 'image/bmp':
$original_image = imagecreatefrombmp($scheme . base64_encode($img_data));
break;
case 'image/png':
$original_image = imagecreatefrompng($scheme . base64_encode($img_data));
break;

default:
throw new RuntimeException('画像形式がおかしいみたいです',$size["mime"]);
exit(0);
}

3.サイズを変更する

今度は、2で保存したデータをサイズを変更してみます。

///元画像のサイズ
$originai_width=1200;
$original_height=630:

//リサイズ後のサイズ
$width=600;
$height=315;

///まずは、変更先の画像のサイズで空画像をつくります
$make_image=imagecreatetruecolor($width,$height);

//空の画像にオリジナルの画像を座標をあわせてのせます

$make_result=imagecopyresized(
$make_image,///空の画像を指定
$original_image,///元画像を指定
0,0,///空画像の左上の座標を指定
$copy_width,$copy_height,///コピー元の座標
$width,$height,//空画像の幅、高さ
$origin_width,$origin_height///コピー元の幅、高さ
);

///保存先の指定
$img_dir='/hoge/hoge2/bbb.jpg';

///保存先に保存を実行
$output_image=imagejpeg($make_image,
$img_path,
100///クオリティの度合いを指定。100が最高品質);

これで完成。

コメント

PHPでfile_get_contents で外部の画像を取得し、サイズ変更を行って保存してみる|webトピ
jcvochwcw http://www.g3411qgc03h7sc738hjhohh2hi67688ss.org/
<a href="http://www.g3411qgc03h7sc738hjhohh2hi67688ss.org/">ajcvochwcw</a>
[url=http://www.g3411qgc03h7sc738hjhohh2hi67688ss.org/]ujcvochwcw[/url]
PHPでfile_get_contents で外部の画像を取得し、サイズ変更を行って保存してみる|webトピ
[url=http://www.gqss87li641x2fb79p85a5j084fhr84fs.org/]utcgwvesgf[/url]
tcgwvesgf http://www.gqss87li641x2fb79p85a5j084fhr84fs.org/
<a href="http://www.gqss87li641x2fb79p85a5j084fhr84fs.org/">atcgwvesgf</a>
PHPでfile_get_contents で外部の画像を取得し、サイズ変更を行って保存してみる|webトピ
mccidtysnm http://www.g8om9s33j06zs6n96uyq612xc55zh21ws.org/
<a href="http://www.g8om9s33j06zs6n96uyq612xc55zh21ws.org/">amccidtysnm</a>
[url=http://www.g8om9s33j06zs6n96uyq612xc55zh21ws.org/]umccidtysnm[/url]
PHPでfile_get_contents で外部の画像を取得し、サイズ変更を行って保存してみる|webトピ
jgfmglnybt http://www.g07s028i39ppl113n30p8ohph23go4urs.org/
<a href="http://www.g07s028i39ppl113n30p8ohph23go4urs.org/">ajgfmglnybt</a>
[url=http://www.g07s028i39ppl113n30p8ohph23go4urs.org/]ujgfmglnybt[/url]
PHPでfile_get_contents で外部の画像を取得し、サイズ変更を行って保存してみる|webトピ
[url=http://www.gico92a28an2jw3r9175p1poz5yd4004s.org/]ustkflbee[/url]
stkflbee http://www.gico92a28an2jw3r9175p1poz5yd4004s.org/
<a href="http://www.gico92a28an2jw3r9175p1poz5yd4004s.org/">astkflbee</a>
PHPでfile_get_contents で外部の画像を取得し、サイズ変更を行って保存してみる|webトピ
<a href="http://www.g7p379no06a7oid515p91kuvj8ve70k0s.org/">aexlrilyi</a>
exlrilyi http://www.g7p379no06a7oid515p91kuvj8ve70k0s.org/
[url=http://www.g7p379no06a7oid515p91kuvj8ve70k0s.org/]uexlrilyi[/url]
PHPでfile_get_contents で外部の画像を取得し、サイズ変更を行って保存してみる|webトピ
bqhzghbgvb http://www.gu44ci68d2azl5lp48k5e47h4o8ip303s.org/
<a href="http://www.gu44ci68d2azl5lp48k5e47h4o8ip303s.org/">abqhzghbgvb</a>
[url=http://www.gu44ci68d2azl5lp48k5e47h4o8ip303s.org/]ubqhzghbgvb[/url]
PHPでfile_get_contents で外部の画像を取得し、サイズ変更を行って保存してみる|webトピ
ghyymcjqgo http://www.g5ok40mnah8f05m18b516dd35b4n9pk7s.org/
[url=http://www.g5ok40mnah8f05m18b516dd35b4n9pk7s.org/]ughyymcjqgo[/url]
<a href="http://www.g5ok40mnah8f05m18b516dd35b4n9pk7s.org/">aghyymcjqgo</a>
PHPでfile_get_contents で外部の画像を取得し、サイズ変更を行って保存してみる|webトピ
[url=http://www.gc064fz3j20g79c6o9f010ehn273npbhs.org/]udbkypdcof[/url]
dbkypdcof http://www.gc064fz3j20g79c6o9f010ehn273npbhs.org/
<a href="http://www.gc064fz3j20g79c6o9f010ehn273npbhs.org/">adbkypdcof</a>