質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.02%

画像ファイルのアップロード時、スマホの画像の向きを補正したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 416

chapp

score 176

お世話なります。dropzone.jsでファイルアップロードしたとき、スマホの画像の向きを補正したいと考えています。

テストとして単体のファイルを用意し実行すると、補正されるまで確認出来ているのですが、dropzone.jsで画像を渡すと、スクリプトが途中で止まっているような現象となっています。

※画像を渡している先は、upload.phpである。
※画像はアップされるが、upload.phpが途中で止まっているのか、エラーが起きているかで全ての処理が実行されない。

お恥ずかしいと思いながらも、以下が実際のファイル(upload.php)です。
コメントで補正部分のスクリプトを示しました。

ここ数日、試行錯誤を繰返していますが、補正スクリプトを加えるとファイル(upload.php)が適正に実行されないという状況が続いています。

お忙しい中恐縮ですが、アドバイスのほどお願い出来れば幸いです。
よろしくお願いいたします。

<?php
session_start();

include($_SERVER['DOCUMENT_ROOT'] . '/define/BasicData.php');

$member_no = $_SESSION["member_no"];
$member_id = $_SESSION["member_id"];

require_once("../../../../security/bonpli/config.php");

    $ds = DIRECTORY_SEPARATOR;

    $storeFolder = "./main_img/";

    if(!empty($_FILES)){

        $tempFile = $_FILES["file"]["tmp_name"];

        $targetPath = dirname( __FILE__ ).$ds.$storeFolder.$ds;

        $filename = $_FILES["file"]["name"];

        $file = explode('.', $filename);
        $kakuchousi = array_pop($file);

        $times=microtime();
        $machining_time=explode(" ",$times);
        $format_time=$machining_time[1]+$machining_time[0];
        $time = $format_time * 10000;
        $time = substr($time, -6);

        $img_filename = $member_no."-".$time.".".$kakuchousi;

        if(isset($_SESSION["img_filename"]) OR $_SESSION["img_filename"] != ""){
            $_SESSION["img_filename"] .= ",".$img_filename;
        }
        else{
            $_SESSION["img_filename"] .= $img_filename;
        }

        $targetFile = $targetPath.$img_filename;

        $filename = $_FILES["file"]["name"];

        $file = explode(".", $filename);
        $file_name = $file[0];

        move_uploaded_file($tempFile,$targetFile);

        $upfile = $storeFolder.$img_filename;


//*** ↓↓ 補正スクリプト ↓↓ ***
$image = orientationFixedImage($upfile, $upfile);

// 画像の方向を正す
function orientationFixedImage($output,$input){
    $image = ImageCreateFromJPEG($input);
    $exif_datas = @exif_read_data($input);
    if(isset($exif_datas['Orientation'])){
        $orientation = $exif_datas['Orientation'];
        if($image) {
            // 未定義
            if($orientation == 0) {

            // 通常
            }else if($orientation == 1) {

            // 左右反転
            }else if($orientation == 2) {
                $image = image_flop($image);
            // 180°回転
            }else if($orientation == 3) {
                $image = image_rotate($image, 180, 0);
            // 上下反転
            }else if($orientation == 4) {
                $image = image_flip($image);
            // 反時計回りに90°回転 上下反転
            }else if($orientation == 5) {
                $image = image_rotate($image, 90, 0);
                $image = image_flip($image);
            // 反時計回りに270°回転
            }else if($orientation == 6) {
                $image = image_rotate($image, 270, 0);
            // 反時計回りに270°回転 上下反転
            }else if($orientation == 7) {
                $image = image_rotate($image, 270, 0);
                $image = image_flip($image);
            // 反時計回りに90°回転
            }else if($orientation == 8) {
                $image = image_rotate($image, 90, 0);
            }
        }
    }
    // 画像の書き出し
    ImageJPEG($image ,$output);
    return $image;
}
// 画像の左右反転
function image_flop($image){
    // 画像の幅を取得
    $w = imagesx($image);
    // 画像の高さを取得
    $h = imagesy($image);
    // 変換後の画像の生成(元の画像と同じサイズ)
    $destImage = @imagecreatetruecolor($w,$h);
    // 逆側から色を取得
    for($i=($w-1);$i>=0;$i--){
        for($j=0;$j<$h;$j++){
            $color_index = imagecolorat($image,$i,$j);
            $colors = imagecolorsforindex($image,$color_index);
            imagesetpixel($destImage,abs($i-$w+1),$j,imagecolorallocate($destImage,$colors["red"],$colors["green"],$colors["blue"]));
        }
    }
    return $destImage;
}
// 上下反転
function image_flip($image){
    // 画像の幅を取得
    $w = imagesx($image);
    // 画像の高さを取得
    $h = imagesy($image);
    // 変換後の画像の生成(元の画像と同じサイズ)
    $destImage = @imagecreatetruecolor($w,$h);
    // 逆側から色を取得
    for($i=0;$i<$w;$i++){
        for($j=($h-1);$j>=0;$j--){
            $color_index = imagecolorat($image,$i,$j);
            $colors = imagecolorsforindex($image,$color_index);
            imagesetpixel($destImage,$i,abs($j-$h+1),imagecolorallocate($destImage,$colors["red"],$colors["green"],$colors["blue"]));
        }
    }
    return $destImage;
}
// 画像を回転
function image_rotate($image, $angle, $bgd_color){
    return imagerotate($image, $angle, $bgd_color, 0);
}
//*** ↑↑ 補正スクリプト ↑↑ ***

        list($width,$height) = getimagesize($upfile);

        //幅を825pxに縮小
        if($width > 825){

            $hiritsu = 825 / $width;

            $width_edit = floor($width * $hiritsu);
            $height_edit = floor($height * $hiritsu);


            if($kakuchousi == "jpeg" OR $kakuchousi == "jpg" OR $kakuchousi == "JPEG" OR $kakuchousi == "JPG"){

                $src = imagecreatefromjpeg($upfile);
            }
            if($kakuchousi == "png" OR $kakuchousi == "PNG"){

                $src = imagecreatefrompng($upfile);
            }
            if($kakuchousi == "gif" OR $kakuchousi == "GIF"){

                $src = imagecreatefromgif($upfile);
            }

            $dst = imagecreatetruecolor($width_edit, $height_edit);

            imagecopyresampled($dst, $src, 0, 0, 0, 0, $width_edit, $height_edit, $width, $height);

            imagejpeg($dst, $upfile);

        }

        $timestamp = time();

        $query = "INSERT INTO b2b_img_upload_temp 
        (temp_no, temp_member_no, temp_img, temp_time)
         VALUES 
        (0, '$member_no', '$img_filename', '$timestamp')";
        mysqli_query($mysqli, $query);

    }

?>

■追記

適正に実行されない・・・説明が不十分でした。
やりたいことは、

「画像をアップ → 適正な向きに補正 → サイズの変更 → DBにインサート」

なのですが、ご提示したスクリプトを実行すると、「サイズの変更」以降が実行されない状況です。向きの補正をする部分をコメントで示していますが、この部分、単体では問題ないものの、上記のように組み立てるとそこで止まっているような状況です。

アドバイスのほど頂戴出来れば幸いです。
よろしくお願いいたします。

■追記➁

色々と追加修正のご依頼ありがとうございます。
dropzone.jsにてupload.php(上記スクリプト)に渡しているので(直接アクセスしていない)Timeoutしている感はないのですが、状況をご説明すると、「正常に返答はあるが、サイズ変更、そしてテーブルへのインサートが実行されていない」という感じです。

補正スクリプト部だけの単体のファイルで実行すると(アップされている画像は)補正されます。

またupload.php も補正スクリプト部を外すと(補正はされないが)正常にサイズ変更、テーブルへのインサートは実行されます。

現状、上記2つを組み合わせるべく試行錯誤を繰返しているのですが、いずれも上手く行かない状況です。

引き続き、アドバイスのほど頂戴出来れば幸いです。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/12/04 09:15

    「適正に実行されない」とは何が起きているのでしょうか

    キャンセル

  • kunai

    2018/12/04 10:46

    「そこで止まる」と言うのは、PHPが実行中のままTimeoutするということでしょうか。正常に返答はあるが、サイズ変更が実行されていないと言う状態でしょうか。状態をそのまま教えてください。

    キャンセル

回答 1

checkベストアンサー

0

$image = orientationFixedImage($upfile, $upfile);


で、画像書き出したあとで

$src = imagecreatefromjpeg($upfile);


とか、$upfileをいじくり回したところで、書き出した後のファイルに影響が出ない(処理されていない)のは当然なのでは。

サイズ変更を行う箇所もfunction化して一括で処理させるか、サイズ変更を行う対象を$upfileではなく$outputにするかしないと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/04 11:52

    kunaiさん

    早々のお返事ありがとうございます。これから席を外す必要があるため、後ほど改めて確認いたします。

    取り急ぎ、御礼まで。
    引き続き、よろしくお願いいたします。

    キャンセル

  • 2018/12/04 17:15

    kunaiさん

    お世話になっております。先ほどから色々と試していますが、そもそも画像の向きが補正出来ていませんでした。要はアップロードしただけの状態。

    質問時に提示したupload.php内にある「向きの補正」ですが、単体では補正されること確認しているのですが、どこがおかしいのでしょうか・・・

    キャンセル

  • 2018/12/05 01:46

    kunaiさん

    お世話になっております。この度は色々とお世話になりました。
    どうしても質問時にご提示したスクリプトでは上手く行かなったため、別のスクリプトにて対処いたしました。

    kunaiさんのご指摘は、考えるきっかけとなりました。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる