実現したいこと
PHP側で行っている画像のリサイズをjs側で行いたい。
- copper.jsを利用して画像をトリミング
- アップロードボタンを押したタイミングで指定値にリサイズ(js)
- トリミングとリサイズをした画像をPOSTでPHPに渡す(Ajax)
- 画像をデコードしてサーバーに保存(PHP)
- 結果をブラウザに通知(js)
発生している問題
実現したいことは上記なのですが、
copper.jsでbase64形式になったデータをjsでリサイズする方法がわかりません。
そのため今は応急処置的に下記のような実装になっています。
- copper.jsを利用して画像をトリミング
- トリミング後リサイズ前のbase64データをPOSTでPHPに渡す(Ajax)
- base64データをデコードして一度サーバーに保存(PHP)
- 保存した画像をまた取り出してトリミングして上書き保存(PHP)※2重アップロード状態です
- 結果をブラウザに通知(js)
※PHPでもbase64データのリサイズ方法がわからなかったので一度そのままアップロードしてます。
jsでbase64をリサイズする方法がわからないため、PHP側でリサイズをかけています。
しかし、この方法だとアップロードに時間がかかり負荷が大きいため、js側で画像処理を終わらせ、PHPではデコードとアップロードのみの処理にしたいです。
現在のソースコード
HTML
1<div class="uploadbtn">アップロードボタン</div> 2<img id="preview" src="data:image/jpeg;base64,/9j/4AAQSkZJRgA........">
javaScript
1$('.uploadbtn').click(function(){ 2 // 3 // おそらくここに何かしらのリサイズ処理を入れる? 4 // 5 $.ajax({ 6 type: 'POST', 7 url: "upload.php", 8 data: { 9 imgdata: $('#preview').cropper('getCroppedCanvas').toDataURL("image/png") 10 }, 11 success: function(data) { 12 if (data == 'UPLOAD OK') { 13 alert('アップロードが完了しました。'); 14 } else { 15 alert(data); 16 } 17 }, 18 error: function() { 19 alert("サーバーエラーです。"); 20 } 21 }); 22});
PHP
1<?php 2if ($_POST) { 3 // base64デコード 4 $data = $_POST['imgdata']; 5 $base64data = explode (",",$data); 6 $decodedata = base64_decode($base64data[1]); 7 8 // finfo_bufferでMIMEタイプを取得 9 $finfo = finfo_open(FILEINFO_MIME_TYPE); 10 $mime_type = finfo_buffer($finfo, $decodedata); 11 12 /* 拡張子情報の取得・セット */ 13 $imginfo = getimagesize($data); 14 $filesize = strlen($decodedata)."\n"; 15 16 if($mime_type == 'image/jpeg'){ 17 $extension = ".jpg"; 18 header ('Content-Type: image/jpg'); 19 } 20 if($mime_type == 'image/png'){ 21 $extension = ".png"; 22 header ('Content-Type: image/png'); 23 } 24 if($mime_type == 'image/gif'){ 25 $extension = ".gif"; 26 header ('Content-Type: image/gif'); 27 } 28 29 // ファイル容量が10mb以上だったらエラー 30 if ($filesize <= 10000000) { 31 /* 拡張子存在チェック */ 32 if(!empty($extension)){ 33 34 // 正式保存先ファイルパス 35 $file_save = "img/testupload.jpg"; 36 37 // ファイル移動 38 $result = file_put_contents($file_save, $decodedata); //ここでリサイズ前に一度保存しちゃう 39 40 list($org_w, $org_h) = getimagesize($file_save); // 元の画像名を指定してサイズを取得 41 42 // 拡大するサイズを指定 43 $copy_w = 400; 44 $copy_h = 400; 45 46 // オリジナルファイルの画像リソース 47 $org_img = imagecreatefrompng($file_save); 48 49 // コピー画像のリソース 50 $copy_img = imagecreatetruecolor($copy_w, $copy_h); 51 52 // リサイズ 53 imagecopyresized($copy_img, $org_img, 0, 0, 0, 0, $copy_w, $copy_h, $org_w, $org_h); 54 55 // 拡大したコピー画像を表示 56 imagejpeg($copy_img, $file_save, 100); 57 58 echo "UPLOAD OK"; 59 60 } else { 61 echo '選択されたファイルは対応していません。'; 62 } 63 } else { 64 echo '画像の容量が大きすぎます。'; 65 } 66} 67?>
補足情報(参照)

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。