Edited at

HTMLから送信した画像データをバイナリにしてDBに収める

数年前、画像+コメントの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()か…覚えていません。