当使用图像干预包通过IOS设备上传图像时,如果图像旋转,如何调整图像大小和方向?

问题描述 投票:-1回答:3

我已经在其他开发人员在stackoverflow上提供的一些教程视频和代码的帮助下开发了Laravel Web应用程序。该应用程序除了图像上传功能外,运行良好。我面临一个问题,该问题与通过任何IOS设备上载的图像在侧面或底部被剪切以及在图像被旋转时在侧面或底部被剪切有关。我已经安装了图像干预工具,但是我不知道将代码放在文件中的什么位置,我在共享控制器代码以及此处显示图像的代码控制器代码

namespace App\Http\Controllers;
use Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\MessageBag;
use App\comment;
use App\User;
use App\post;
use View;
use Lang;
use image;
class usersController extends Controller
{
    private $u;

    public function __construct(){
        $this->u = new User();
    }
    public function search(Request $request){
        $search_input = $request["input"];
        $path = $request["path"];
        $users = User::where("name","like","%$search_input%")->orWhere("username","like","%$search_input%")->get();

        if ($users->isEmpty()) {
            return "<p style='text-align: center;width: 100%;color: gray;font-size: 12px;margin: 3px'>".Lang::get('trans.nothingToShow')."</p>";
        }else{
            foreach ($users as $user) {
                if ($user->verify == 1) {
                    $ifVerify = '<span class="verify-badge" style="width: 420px; height: 700px; background:  url(\''.$path.'/imgs/verify.png\') no-repeat; background-size: cover; margin: 0px 2px;"></span>';
                }else{
                    $ifVerify = '';
                }
                if($user->avatar == "avatar.png"){
                    $avatar_path = '/imgs/avatar.png';
                }else{
                    $avatar_path = '/storage/avatar/'.$user->avatar;
                }
                echo '<div class="navbar-search-item">
                    <a href="'.$path.'/'.$user->username.'">
                        <div>
                            <div style="background-image:url(\''.$path.$avatar_path.'\');">
                            </div>
                            <p>
                                '.$user->name.$ifVerify.'<br>
                                <span>@'.$user->username.'</span>
                            </p>
                        </div>
                    </a>
                </div>';
            }
        }
    }
    public function profile($username){
        $user_info = User::where("username",$username)->get();
        foreach ($user_info as $uinfo) {
            $user_id = $uinfo->uid;
        }
        if (isset($user_id)) {
            $feedbacks = post::where("to_id",$user_id)->where("privacy",1)->orderBy('time', 'desc')->get();
            $feedbacks_count = post::where("to_id",$user_id)->get()->count();
            $new_count = post::where("to_id",$user_id)->where('read',0)->get()->count();
            // check comments on post (count)
            $commentsCount = array();
            foreach ($feedbacks as $fb) {
                $pid = $fb->pid;
                $countComments = comment::where("c_pid",$pid)->get()->count();
                array_push($commentsCount,$countComments);
            }
            return view("pages.profile")->with(["user_info" => $user_info,"feedbacks" => $feedbacks,'feedbacks_count' => $feedbacks_count,'new_count' => $new_count,'commentsCount' => $commentsCount]);
        }else{
            return view("pages.profile")->with(["user_info" => $user_info]);
        }
    }
    public function settings($username){
        $user_info = User::where("username",$username)->get();
        if (Auth::user()->username == $username) {
            return view("pages.settings")->with("user_info",$user_info);
        }else{
            return redirect()->back();
        }

    }
    public function s_general(Request $request){
        $this->validate($request,[
            'avatar' => 'nullable|image|mimes:jpeg,png,jpg|max:3072',
            'fullname' => 'required',
            'email' => 'required|email'
        ]);
        if ($request['fullname'] == Auth::user()->name && $request['email'] == Auth::user()->email && !$request->hasFile('avatar')) {
            return redirect()->back()->with('general_msg', Lang::get('trans.noChanges_MSG'));
        }else{
            $avatar = $request->file('avatar');
            if ($request->hasFile('avatar')) {
                $avatar_ext = $avatar->getClientOriginalExtension();
                $avatar_name = rand(9,999999999)+time().".".$avatar_ext;
                $avatar_new = $avatar->storeAs("avatar",$avatar_name);
            }else{
                $avatar_name = Auth::user()->avatar;
            }
            $update_general = User::where('uid',Auth::user()->uid)->update(['name' => $request['fullname'],'email' => $request['email'],'avatar' => $avatar_name]);
            return redirect()->back()->with('general_msg', Lang::get('trans.changes_saved'));
        }

    }

这就是我显示图像的方式 <div class="profile-avatar" style="width: 300px;height:400px; border-radius: 0%;background-image: url('@if(Auth::user()->avatar == "avatar.png") {{ url("/imgs/".Auth::user()->avatar) }} @else {{ url("/storage/avatar/".Auth::user()->avatar) }} @endif');">

请帮助我提供应该放置的代码以及应该放置在哪里,以便解决此问题

此代码用于图像预览

  <div style="display: inline-flex;">
    <div class="profile-avatar" id="settings_img_elm" style="margin: 10px; width:350px;margin-top: 0; margin-bottom: 0;border-color: #fff; text-align: center;background-image: url('@if(Auth::user()->avatar == "avatar.png") {{ url("/imgs/".Auth::user()->avatar) }} @else {{ url("/storage/avatar/".Auth::user()->avatar) }} @endif');">
  </div>
  <p style="color: #a7aab5; font-size: 9px;padding: 25px 10px 25px 10px; margin: 0;">@lang("trans.preview")<br>@lang("trans.maxSize")<br>upload vertical <br>images.<br>Save the<br>image first<br> and then<br> check the<br> preview</p>
  </div>
  <p style="border-bottom: 1px solid #dfe2e6;margin: 0; margin-top: 12px; margin-bottom: 12px;">
    <input type="file" name="avatar" style="display: none;" id="settings_img">
    <label for="settings_img" class="btn btn-success">@lang("trans.selectImage")</label>

预览图像的javascript是

function imagePreview(input,elm) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();
            reader.onload = function (e) {
                $(elm).css("background-image","url('"+e.target.result+"')");
            }
            reader.readAsDataURL(input.files[0]);
        }
    }
    $("#settings_img").on("change",function(){
        imagePreview(this,"#settings_img_elm");
    });
    $("#feedback_hFile").on("change",function(){
        $(".send_feedback_image").show();
        imagePreview(this,"#sfb_image_preview");
    });
iphone laravel image-uploading image-resizing uiimageorientation
3个回答
1
投票

下面的代码可以帮助您入门。您在这里寻找的两个关键问题是干预orientateresize方法,它们应处理您提到的两个问题。方向将根据EXIF数据旋转图像,并且调整大小可以将图像调整为所需的规格。

导入立面

use Intervention\Image\Facades\Image;

建议

从您的导入中删除use image;,因为这可能会导致或将导致您的问题。无效。

s_gen方法的调整

public function s_general(Request $request){
    $this->validate($request,[
        'avatar' => 'nullable|image|mimes:jpeg,png,jpg|max:3072',
        'fullname' => 'required',
        'email' => 'required|email'
    ]);

    if ($request['fullname'] === Auth::user()->name && $request['email'] === Auth::user()->email && !$request->hasFile('avatar')) {
        return redirect()->back()->with('general_msg', Lang::get('trans.noChanges_MSG'));
    }

    if ($request->hasFile('avatar')) {
        // Grab the original image from the request
        $originalImage = $request->file('avatar');

        // Grab the original image extension
        $originalExtension = $originalImage->getClientOriginalExtension();

        // Instantiate a new Intervention Image using our original image,
        // read the EXIF 'Orientation' data of the image and rotate the image if needed
        $newImage = Image::make($originalImage)->orientate();

        // Resize the new image to a width of 300 and a height of null (auto)
        // we also use a callback to constrain the aspect ratio so we don't distort the image on resize
        $newImage->resize(300, null, function ($constraint) {
            $constraint->aspectRatio();
        });

        // Generate a randomized filename and append the original image extension
        $filename = random_int(9, 999999999) + time() . '.' . $originalExtension;

        // Save the new image to disk
        $newImage->save(storage_path('app/public/avatar/' . $filename));
    } else {
        $filename = Auth::user()->avatar;
    }

    User::where('uid', Auth::user()->uid)->update(
        [
            'name' => $request['fullname'],
            'email' => $request['email'],
            'avatar' => $filename
        ]);

    return redirect()->back()->with('general_msg', Lang::get('trans.changes_saved'));
}

更多建议

我知道这不是代码审查,但是使用PascalCase作为您的班级名称。我看到您有一些进口,例如App\commentApp\post

您的构造函数似乎不是必需的。我抛弃它。如果您继续使用它,我将习惯于使用更具描述性的变量名。像$ u这样的短名称通常被认为是不好的做法。

您有一些未使用的导入,可以删除ValidatorHashMessageBag进行清理。

您的控制器正在做很多事情,大多数人会认为这是不好的做法。以html为例。在十分之九的时间内,您可能应该利用刀片来完成这些事情,因为这是刀片的主要用途之一。

坚持一种或另一种命名约定。您正在使用camelCase和snake_case的混合变量。我更喜欢camelCase,但是无论您选择哪种方式,都最好坚持使用它,而不要混在一起。

对不起,我知道这不是代码审查,我只是想一些建议可以在将来对您有所帮助。


0
投票

您可以查看有关resize图像的Intervation文档,我还为您创建了s_general函数的示例:

$avatar = $request->file('avatar');

if ($request->hasFile('avatar')) {

    //pass uploaded avatar to Intervention Image instance
    $image = \Image::make($avatar);

    //resize image to 300 width, keep height automated adjusted, or any other width you need
    $image->resize(300, null, function ($constraint) {
        $constraint->aspectRatio();
    });

    //Or you can set specific width and height
    //$image->resize(300, 200);

    $avatar_ext = $avatar->getClientOriginalExtension();
    $avatar_name = rand(9,999999999) + time().".".$avatar_ext;


    //I used public path to store the image you can change it based on your needs
    $image->save(public_path('/avatar/'.$avatar_name));

}else{

    $avatar_name = Auth::user()->avatar;
}

0
投票

使用图像干预来调整大小并校正从手机上传的图像的方向。如果您正在使用简单的javascript显示此图像的预览,例如

reader.onload = function (e) {
                $(elm).css("background-image","url('"+e.target.result+"')"); 

然后,图像预览的方向可能不会如我们所愿,但是一旦保存图像,方向将是正确的。这种定位问题通常在iphone上遇到。方向校正和调整大小的代码是

  $newImage = Image::make($originalImage)->orientate();


        $newImage->resize(300, null, function ($constraint) {
            $constraint->aspectRatio();
        });
///or for resizing use

 $newImage->resize(width,height);
© www.soinside.com 2019 - 2024. All rights reserved.