数年前、画像+コメントのSNSライクなコンテンツを作って、画像処理で苦労したコードです。
コンテンツは、今も現役で動いています。
「縦なのに、データは横になっている写真を正しくグリンしたり」は、スマホなどで投稿する場合に、我ながら親切で、当時は感動しました。
特に、山中などから実況投稿する場合に有難いのです。
##画像処理コード
<input type="file">
をPHPで受けて
- 縦なのに、データは横になっている写真を正しくグリンしたり
- サイズを変更したりして
- バッファリングして
- バイナリをゲットして
- DBに収められるようにする
というコードです。
//フォームから送信された画像データが存在する場合のみ実行
if ($_FILES['localImage']['tmp_name'] != "") {
//JPEGの場合
if ($baseInfo['mime'] == "image/jpeg") {
//画像を読み込む
$imageInport = imagecreatefromjpeg($_FILES['localImage']['tmp_name']);
}
//PNGの場合
if ($baseInfo['mime'] == "image/png") {
//画像を読み込む
$imageInport = imagecreatefrompng($_FILES['localImage']['tmp_name']);
}
//GIFの場合
if ($baseInfo['mime'] == "image/gif") {
//画像を読み込む
$imageInport = imagecreatefromgif($_FILES['localImage']['tmp_name']);
}
//画像の向き
$exifData = exif_read_data($_FILES['localImage']['tmp_name']);
//90度画像の場合
if ($exifData['Orientation'] == 6) {
//画像回転
$imageInport = imagerotate($imageInport, 270, 0);
}
//180度画像の場合
if ($exifData['Orientation'] == 3) {
//画像回転
$imageInport = imagerotate($imageInport, 180, 0);
}
//270度画像の場合
if ($exifData['Orientation'] == 8) {
//画像回転
$imageInport = imagerotate($imageInport, 90, 0);
}
//横サイズ
$inWidth = imagesx($imageInport);
//縦サイズ
$inHeight = imagesy($imageInport);
//サイズ変更後の縦サイズ(次第で、生成する画像サイズが決まる)
$outHeight = 600;
//サイズ変更後の横サイズ)
$outWidth = $inWidth * ($outHeight / $inHeight);
//サイズ変更後の画像データを生成
$imageOutput = imagecreatetruecolor($outWidth, $outHeight);
//imagecopyresampled(器, 画像データ, コピー先X座標, コピー先Y座標, コピー元X座標, コピー元Y座標, コピー先幅, コピー先高さ, コピー元幅, コピー元高さ)
imagecopyresampled($imageOutput, $imageInport, 0, 0, 0, 0, $outWidth, $outHeight, $inWidth, $inHeight);
//バッファリング
ob_start();
//JPEGとして出力
imagejpeg($imageOutput);
//要素を取得
$imageOutput = ob_get_contents();
//バッファリング終了
ob_end_clean();
//SQL用にエスケープ
$insertImage = @mysqli_real_escape_string($con, $imageOutput);
}
##ファイルサイズチェックは
//~2MBの例
if (filesize($_FILES['localImage']['tmp_name']) >1048576 * 2) {
//処理しない
}
##確か透過を保持するのは(自信無し)
//サイズ変更後の画像データを生成
の後に
//ブレンドモードを無効にする
imagealphablending($imageOutput, false);
//完全なアルファチャネル情報を保存するフラグをonにする
imagesavealpha($imageOutput, true);
出力はimagepng()かimagegif()か…覚えていません。