拡張子がgifでもIMAGETYPE_PNG

$image = @imagecreatefromgif(hoge.gif);
imagejpeg($image, 'hoge.jpg');

上記のようにexif_imagetypeのswitchで判定してjpegをつくろうとしていたのですが、全く動かなかったので、テストに使ったgif拡張子を判定すると

<?php

switch(exif_imagetype('hoge.gif')){
	 case IMAGETYPE_JPEG :
	 		echo "def";
	 		break;
	 case IMAGETYPE_GIF :
	  		echo "gif";
	 		break;
	 case IMAGETYPE_PNG :
	  		echo "png";
	 		break;
}
?>

勘弁してよ、3時間ぐらい迷走していました。もうやだ。

画像ファイルのアップロード

<?php

$dir = "upload";
if (!$handle=opendir($dir)) die("ディレクトリの読み込みに失敗しました");
while($filename=readdir($handle))
{
 if(!preg_match("/^\./", $filename))
 {
 if (!unlink("$dir/$filename")) die("ファイルの削除に失敗しました");
 }
}

if (isset ( $_FILES &#91;'file'&#93; ) && is_uploaded_file ( $_FILES &#91;'file'&#93; &#91;'tmp_name'&#93; )) {
    $old_name = $_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;;
    $new_name = date("YmdHis");
    $new_name .= mt_rand();
    switch (exif_imagetype($_FILES&#91;'file'&#93;&#91;'tmp_name'&#93;)) {
        case IMAGETYPE_JPEG :
            $new_name .= '.jpg';
            break;
        case IMAGETYPE_GIF :
            $new_name .= '.gif';
            break;
        case IMAGETYPE_PNG :
            $new_name .= '.png';
            break;
        default :
            header ( 'Location: upload.php' );
            exit ();
    }
    $gazou = basename($_FILES&#91;'file'&#93;&#91;'name'&#93;);
    if (move_uploaded_file($old_name, 'upload/'.$new_name)) {
        echo $gazou . 'のアップロードに成功しました';
    } else {
        echo 'アップロードに失敗しました';
    }
}

if(!isset($_POST&#91;'delte'&#93;)){
   unlink("upload/".$_POST&#91;'delete'&#93;."");
} 
?>

<!doctype html>
<form action="#" method="POST" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit" value="ファイルをアップロードする">
  <input type="hidden" name="MAX_FILE_SIZE" value="4194304" />
</form><br>

<?php
if(isset($_FILES&#91;'file'&#93;&#91;'name'&#93;)){
	echo "<img src=\"upload/" .$new_name. "\"><br><br>";
}
?>
<form action = "#" method = "post">
<input type = "submit" value ="削除する">
<input type="hidden" name="delete" value="<?php echo $new_name ?>">
</form>

PHP GDライブラリ colorize

<?php

$im = imagecreatefromjpeg('img/20180302-0.jpeg');
echo '<img src="img/20180302-0.jpeg" width="200" height="120"><br>';

$r = '0';
$g = '255';
$b = '0';
if($im && imagefilter($im, IMG_FILTER_COLORIZE, $r, $g, $b)){
	imagejpeg($im, 'colorized.jpeg');
	imagedestroy($im);
} 
echo '<img src="colorized.jpeg" width="200" height="120"><br>';

$im = imagecreatefromjpeg('img/20180302-0.jpeg');
$r1 = '255';
$g1 = '0';
$b1 = '0';
if($im && imagefilter($im, IMG_FILTER_COLORIZE, $r1, $g1, $b1)){
	imagejpeg($im, 'colorized2.jpeg');
	imagedestroy($im);
} 
echo '<img src="colorized2.jpeg" width="200" height="120"><br>';

$im = imagecreatefromjpeg('img/20180302-0.jpeg');
$r2 = '0';
$g2 = '0';
$b2 = '255';
if($im && imagefilter($im, IMG_FILTER_COLORIZE, $r2, $g2, $b2)){
	imagejpeg($im, 'colorized3.jpeg');
	imagedestroy($im);
} 
echo '<img src="colorized3.jpeg" width="200" height="120">';

photoshopのように、rgbを加工することができますね。

negate

<?php

$im = imagecreatefromjpeg('img/20180302-0.jpeg');
echo '<img src="img/20180302-0.jpeg" width="200" height="120"><br>';

if($im && imagefilter($im, IMG_FILTER_NEGATE)){
	imagejpeg($im, 'negated.jpeg');
	imagedestroy($img);
}
echo '<img src="negated.jpeg" width="200" height="120"><br>';
?>

画像の色を反転

その他、IMG_FILTER_GRAYSCALE, IMG_FILTER_BRIGHTNESS, IMG_FILTER_CONTRAST, IMG_FILTER_EDGEDETECT, IMG_FILTER_EMBOSS, IMG_FILTER_GAUSSIAN_BLUR, IMG_FILTER_SELECTIVE_BLUR, IMG_FILTER_MEAN_REMOVAL, IMG_FILTER_SMOOTH, IMG_FILTER_PIXELATEなどがあります。

<?php

$im = imagecreatefromjpeg('img/20180302-0.jpeg');
echo '<img src="img/20180302-0.jpeg" width="200" height="120"><br>';

if($im && imagefilter($im, IMG_FILTER_PIXELATE, 15)){
	imagejpeg($im, 'pixelated.jpeg');
	imagedestroy($img);
}
echo '<img src="pixelated.jpeg" width="200" height="120"><br>';
?>

画像の縮小・拡大

元画像を縮小し、Getパラメーターでパスを送ります。

<?php

$file1 = "img/20180331-0.jpeg";
$name = substr($file1, 4);

$file2 = "img_s/".$name."";
$file3 = "img_s2/".$name."";
$in = ImageCreateFromJPEG($file1); //元画像ファイル読み込み
$size = GetImageSize($file1); // 元画像サイズ取得

$width = $size&#91;0&#93; / 2;
$height = $size&#91;1&#93; / 2;
$out = ImageCreateTrueColor($width, $height); // 画像生成
ImageCopyResampled($out, $in, 0, 0, 0, 0, $width, $height, $size&#91;0&#93;, $size&#91;1&#93;);
ImageJPEG($out, $file2);

$width2 = $size&#91;0&#93; / 3;
$height2 = $size&#91;1&#93; / 3;
$out2 = ImageCreateTrueColor($width2, $height2); // 画像生成
ImageCopyResampled($out2, $in, 0, 0, 0, 0, $width2, $height2, $size&#91;0&#93;, $size&#91;1&#93;);
ImageJPEG($out2, $file3);

ImageDestroy($in);
ImageDestroy($out);
ImageDestroy($ou2);
?>
<?php echo (int)$width2.'x'.(int)$height2."px" ?> <a href="file.php?id=<?php echo $file3 ?>">JPEGでダウンロード</a> | <a href="">GIFでダウンロード</a><br>
<img src="<?php echo $file3 ?>"><br>
<br>

<?php echo (int)$width.'x'.(int)$height."px" ?> <a href="file.php?id=<?php echo $file2 ?>">JPEGでダウンロード</a> | <a href="">GIFでダウンロード</a><br>
<img src="<?php echo $file2 ?>"><br>
<br>
<?php echo $size&#91;0&#93;.'x'.$size&#91;1&#93;. "px"  ?> <a href="file.php?id=<?php echo $file ?>">JPEGでダウンロード</a> | <a href="">GIFでダウンロード</a><br>
<img src="<?php echo $file1 ?>">

おいおいおい、これでいいのかよ?

phpでファイルのダウンロード

index.html

<a href="file.php">ダウンロード</a>

file.php

<?php

$fpath = './img/20180331-0.jpeg';

$fname = '0.jpeg';

header('Content-Type: application/force-download');
header('Content-Length: '.filesize($fpath));
header('Content-disposition: attachment; filename="'.$fname.'"');
readfile($fpath);
?>

リンク押下でダウンロードが開始されます。

filesizeは指定したファイルのサイズを取得
readfile()は指定したファイル内容を全読み込んで標準出力に出力

pixtabay apiで遊んでみる その5 DB連携

pixtabay urlをUNIQUEで、テーブルをつくります。

CREATE TABLE img.pixtabay (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	pixtaurl VARCHAR(255) UNIQUE,
	imgurl VARCHAR(60),
	tags VARCHAR(255)
);

続いて、apiから、画像を取得し、dbに画像のパス・タグを入れます。

$stmt = $dbh -> prepare("INSERT IGNORE INTO pixtabay (pixtaurl, imgurl, tags) VALUES(:pixtaurl, :imgurl, :tags)");

$date = date("Ymt");
$i=0;
foreach($url as $value){
	$data = file_get_contents($value);
    $pass = "img/" .$date. "-" . $i . ".jpeg";
    $stmt->bindParam(':pixtaurl', $url[$i], PDO::PARAM_STR);
    $stmt->bindParam(':imgurl', $pass, PDO::PARAM_STR);
    $stmt->bindParam(':tags', $tags[$i], PDO::PARAM_STR);
    $stmt->execute();
    file_put_contents($pass, $data);
    $i++;
}
?>

検索クエリに一致するタグがある画像パスをDBから取得して表示

 
$query = "アップル";
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){

	if(strpos($result["tags"], $query) !== false){
		$url[] = $result["imgurl"];
	}
}

echo "タグに". $query. "を含む画像<br>";
// var_dump($url);
foreach($url as $value){
	echo "<img src=\"" .$value. "\" width=\"200\" height=\"120\" >";
}
?>

ぎゃーーーー

mysql UNIQUEとignore

まず、テーブルをつくります。imgurlはuniqueとします。

CREATE TABLE img.test (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	imgurl VARCHAR(60) UNIQUE,
	tags VARCHAR(255)
);

insert ingore intoで挿入します。

insert ignore into test(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');
insert ignore into test(imgurl, tags) values('img/20180331-2.jpeg', 'iphone, 6 s, プラス');
insert ignore into test(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');

結果


mysql> insert ignore into test(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');
Query OK, 1 row affected (0.01 sec)

mysql> insert ignore into test(imgurl, tags) values('img/20180331-2.jpeg', 'iphone, 6 s, プラス');
Query OK, 1 row affected (0.00 sec)

mysql> insert ignore into test(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');
Query OK, 0 rows affected (0.05 sec)

mysql> select * from test;
+----+---------------------+-------------------------------------------------+
| id | imgurl              | tags                                            |
+----+---------------------+-------------------------------------------------+
|  1 | img/20180331-0.jpeg | スマー トな腕時計, アップル, 技術               |
|  2 | img/20180331-2.jpeg | iphone, 6 s, プラス                             |
+----+---------------------+-------------------------------------------------+
2 rows in set (0.00 sec)

あら、いけるかも。

PDOでpixtabay apiの情報をmysqlに入れる

<?php

$apikey = "donot watch";
$query = "apple+watch";
$type = "photo"; 
//  "all", "photo", "illustration", "vector" 
$cate = "fashion";
// fashion, nature, backgrounds, science, education, people, feelings, religion, health, places, animals, industry, food, computer, sports, transportation, travel, buildings, business, music
$lang = "";

$orientation = "";
//"all", "horizontal", "vertical" 
$per_page = "";
//Accepted values: 3 - 200 
$order = "";
//"popular", "latest" 
$per_page = "";
//Accepted values: 3 - 200 

$baseurl = "https://pixabay.com/api/?key=". $apikey."&q=".$query."&image_type=".$type."&lang=ja&category=".$cate."";


$json = file_get_contents($baseurl);
$obj = json_decode($json);


// print_r('<pre>');
// var_dump($obj);
// print_r('</pre>');

foreach($obj->hits as $value){
	$url[] = $value->webformatURL;
	$tags[] = $value->tags;
}

$dsn = "mysql:dbname=img;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
}

$stmt = $dbh -> prepare("INSERT INTO pixtabay (imgurl, tags) VALUES(:imgurl, :tags)");

$date = date("Ymt");
$i=0;
foreach($url as $value){
    $pass = "img/" .$date. "-" . $i . ".jpeg";
    $stmt->bindParam(':imgurl', $pass, PDO::PARAM_STR);
    $stmt->bindParam(':tags', $tags[$i], PDO::PARAM_STR);
    $stmt->execute();
    $i++;
}
?>

入ってますね♪

問題は画像の重複ですが。。。

pixtabay apiで遊んでみる その4 DB連携

まず、DBをつくってデータを入れます。

create database img;

CREATE TABLE img.pixtabay (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	imgurl VARCHAR(60),
	tags VARCHAR(255)
);

insert into pixtabay(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');
insert into pixtabay(imgurl, tags) values('img/20180331-2.jpeg', 'iphone, 6 s, プラス');
insert into pixtabay(imgurl, tags) values('img/20180331-0.jpeg', 'スマー トな腕時計, アップル, 技術');

mysql> select * from pixtabay;
+----+---------------------+-------------------------------------------------+
| id | imgurl              | tags                                            |
+----+---------------------+-------------------------------------------------+
|  1 | img/20180331-0.jpeg | スマートな腕時計, アップル, 技術                |
|  2 | img/20180331-2.jpeg | iphone, 6 s, プラス                             |
|  3 | img/20180331-0.jpeg | スマー トな腕時計, アップル, 技術               |
+----+---------------------+-------------------------------------------------+
3 rows in set (0.00 sec)

次に、DBからデータを取り出して、表示します。

<?php

$dsn = "mysql:dbname=img;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select * from pixtabay";
$stmt = $dbh->query($sql);
 
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
    $url[] = $result["imgurl"];
}

var_dump($url);
foreach($url as $value){
	echo "<img src=\"" .$value. "\" width=\"200\" height=\"120\" >";
}
?>

そして、fetchの条件に、〇〇を含むを入れます。ここでは、タグに”プラス”という単語が入っていた場合を考えます。

<?php

$dsn = "mysql:dbname=img;host=localhost";
$user = "foo";
$password = "foofoo";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select * from pixtabay";
$stmt = $dbh->query($sql);
 
$query = "プラス";
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){

	if(strpos($result["tags"], $query) !== false){
		$url[] = $result["imgurl"];
	}
}

echo "タグに". $query. "を含む画像<br>";
// var_dump($url);
foreach($url as $value){
	echo "<img src=\"" .$value. "\" width=\"200\" height=\"120\" >";
}
?>

おいおい、割と簡単にできたけど、こんなんでいいのか?