LoginSignup
1
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-11

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1