{"id":24795,"date":"2021-05-25T13:47:00","date_gmt":"2021-05-25T10:47:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=24795"},"modified":"2021-10-17T20:40:15","modified_gmt":"2021-10-17T17:40:15","slug":"kuinka-ladata-ja-rajata-kuvaa-laravelissa-kayttamalla-imgareaselect-ja-intervention-kuvakirjastoa","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/fi\/kuinka-ladata-ja-rajata-kuvaa-laravelissa-kayttamalla-imgareaselect-ja-intervention-kuvakirjastoa\/","title":{"rendered":"Kuinka ladata ja rajata kuvaa Laravelissa k\u00e4ytt\u00e4m\u00e4ll\u00e4 imgAreaSelect- ja Intervention-kuvakirjastoa"},"content":{"rendered":"<p>\u00c4skett\u00e4in yksi lukijoistamme pyysi kirjoittamaan artikkelin kuvien lataamisesta ja rajaamisesta Laraveliin. Aiemmin julkaisin samaa aihetta koskevan artikkelin PHP: n <a href=\"https:\/\/themewp.inform.click\/fi\/kuinka-ladata-rajata-ja-muuttaa-kuvan-kokoa-jqueryn-ja-php-n-avulla\/\" title=\"lataamiseen, rajaamiseen ja kuvan koon muuttamiseen PHP: ss\u00e4\" >lataamiseen, rajaamiseen ja kuvan koon muuttamiseen PHP: ss\u00e4<\/a>. Mutta kun on kyse Laravelista, meid\u00e4n on teht\u00e4v\u00e4 muutoksia Laravelin standardien mukaisesti. T\u00e4ss\u00e4 artikkelissa tutkitaan, miten kuvia ladataan ja rajataan Laraveliin.<\/p>\n<p>T\u00e4ss\u00e4 opetusohjelmassa aion k\u00e4ytt\u00e4\u00e4 kahta kirjastoa &#8211; imgAreaSelect ja Intervention Image.<\/p>\n<p><a href=\"https:\/\/plugins.jquery.com\/imgareaselect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">imgAreaSelect<\/a> on jQuery-laajennus, joka mahdollistaa kuvien rajaamisen valitsemalla kuvan suorakulmaisen alueen. Se on kevyt laajennus ja helppo k\u00e4ytt\u00e4\u00e4.<\/p>\n<p>Toisaalta <a href=\"http:\/\/image.intervention.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Intervention Image<\/a> on kuvank\u00e4sittely- ja manipulointikirjasto. T\u00e4m\u00e4 kirjasto auttaa meit\u00e4 luomaan, muokkaamaan ja s\u00e4velt\u00e4m\u00e4\u00e4n kuvia palvelinpuolella.<\/p>\n<p>T\u00e4ss\u00e4 opetusohjelmassa k\u00e4yt\u00e4n imgAreaSelect-sovellusta saadaksesi rajatun kuvan ja Intervention-kuvakirjaston koordinaatit kuvan rajaamiseksi palvelinpuolelle koordinaattien mukaisesti.<\/p>\n<h3>P\u00e4\u00e4st\u00e4 alkuun<\/h3>\n<p>Aloittamiseksi sinun olisi pit\u00e4nyt asentaa Laravel. Jos et ole viel\u00e4 luonut, asenna se komennolla:<\/p>\n<pre><code>composer create-project --prefer-dist laravel\/laravel laravel-dev<\/code><\/pre>\n<p>Yll\u00e4 oleva komento asettaa sinulle Laravel-projektin nimelt\u00e4 &#8217;laravel-dev&#8217;.<\/p>\n<p>Asenna seuraavaksi Intervention kuvakirjasto Laravel-projektiisi. Suorita alla oleva komento projektin juurihakemistosta.<\/p>\n<pre><code>composer require intervention\/image<\/code><\/pre>\n<p>Kun olet asentanut kirjaston, avaa <code>config\/app.php<\/code>tiedosto ja lis\u00e4\u00e4 siihen seuraavat rivit.<\/p>\n<p>Lis\u00e4\u00e4 t\u00e4m\u00e4n paketin palveluntarjoajat <code>$providers<\/code>matriisiin.<\/p>\n<pre><code>InterventionImageImageServiceProvider::class<\/code><\/pre>\n<p>Lis\u00e4\u00e4 julkisivu <code>$aliases<\/code>taulukkoon.<\/p>\n<pre><code>'Image' =&gt; InterventionImageFacadesImage::class<\/code><\/pre>\n<p>Lataa lopuksi <a href=\"https:\/\/plugins.jquery.com\/imgareaselect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">imgAreaSelect-<\/a> laajennus. Kopioi ladatusta ZIP-tiedostosta kuvat, CSS-, JS-tiedosto ja liit\u00e4 Laravel-projektin julkiseen kansioon. Pohjimmiltaan rakenteen tulisi olla kuin alla oleva kuvakaappaus.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20475-6081f7850f82b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20475-6081f7850f82b.png\" alt=\"Kuinka ladata ja rajata kuvaa Laravelissa k\u00e4ytt\u00e4m\u00e4ll\u00e4 imgAreaSelect- ja Intervention-kuvakirjastoa\" ><\/a><\/p>\n<h3>Kuinka k\u00e4ytt\u00e4\u00e4 imgAreaSelect-ohjelmaa<\/h3>\n<p>Rakennamme sille rakenteen, koska aiomme k\u00e4ytt\u00e4\u00e4 imgAreaSelect-laajennuksen CSS: \u00e4\u00e4 ja JS: \u00e4\u00e4. Luo <code>resources\/views\/layouts\/app.blade.php<\/code>tiedosto ja lis\u00e4\u00e4 siihen alla oleva koodi.<\/p>\n<pre><code>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"{{ app()-&gt;getLocale() }}\"&gt;\n&lt;head&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;meta charset=\"utf-8\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"&gt;\n\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0&lt;!-- CSRF Token --&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;meta name=\"csrf-token\" content=\"{{ csrf_token() }}\"&gt;\n\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0&lt;title&gt;{{ config('app.name', 'Laravel') }}&lt;\/title&gt;\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0@yield('style')\n&lt;\/head&gt;\n&lt;body&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;div id=\"app\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@yield('content')\n\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0@yield('footer')\n&lt;\/body&gt;\n&lt;\/html&gt;<\/code><\/pre>\n<p>T\u00e4m\u00e4 tiedosto toimii yhten\u00e4isen\u00e4 tiedostona kaikille terille. Paikkamerkkien (<code>@yield<\/code>) avulla koodi voidaan sijoittaa ter\u00e4tiedostoon vastaaviin paikkoihin, kuten otsikkoon, alatunnisteeseen jne.<\/p>\n<p>Luo <code>image.blade.php<\/code>tiedosto <code>resources\/views<\/code>hakemistoon. T\u00e4ll\u00e4 korttitiedostolla on seuraava koodi.<\/p>\n<p><strong>image.blade.php<\/strong><\/p>\n<pre><code>@extends('layouts.app')\n\u00a0\u00a0\n@section('style')\n\u00a0\u00a0\u00a0\u00a0&lt;link rel=\"stylesheet\" href=\"{{ asset('css\/imgareaselect.css') }}\" \/&gt;\n@endsection\n\u00a0\u00a0\n@section('content')\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0@if(session('success'))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"alert alert-success\"&gt;{{session('success')}}&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0@endif\n\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0&lt;div class=\"container mt-5\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;form action=\"{{ url('image') }}\" method=\"post\" enctype=\"multipart\/form-data\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"form-group\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label for=\"exampleInputImage\"&gt;Image:&lt;\/label&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"file\" name=\"profile_image\" id=\"exampleInputImage\" class=\"image\" required&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"hidden\" name=\"x1\" value=\"\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"hidden\" name=\"y1\" value=\"\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"hidden\" name=\"w\" value=\"\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"hidden\" name=\"h\" value=\"\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{{ csrf_field() }}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;button type=\"submit\" class=\"btn btn-primary\"&gt;Submit&lt;\/button&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/form&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"row mt-5\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;p&gt;&lt;img id=\"previewimage\" style=\"display:none;\"\/&gt;&lt;\/p&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@if(session('path'))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;img src=\"{{ session('path') }}\" \/&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0@endif\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n@endsection\n\u00a0\n@section('footer')\n\u00a0\u00a0\u00a0\u00a0&lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jquery\/3.5.1\/jquery.min.js\"&gt;&lt;\/script&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;script src=\"{{ asset('js\/jquery.imgareaselect.min.js') }}\"&gt;&lt;\/script&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;script&gt;\n\u00a0\u00a0\u00a0\u00a0jQuery(function($) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var p = $(\"#previewimage\");\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$(\"body\").on(\"change\", \".image\", function(){\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var imageReader = new FileReader();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0imageReader.readAsDataURL(document.querySelector(\".image\").files[0]);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0imageReader.onload = function (oFREvent) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0p.attr('src', oFREvent.target.result).fadeIn();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0};\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('#previewimage').imgAreaSelect({\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0onSelectEnd: function (img, selection) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('input[name=\"x1\"]').val(selection.x1);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('input[name=\"y1\"]').val(selection.y1);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('input[name=\"w\"]').val(selection.width);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('input[name=\"h\"]').val(selection.height);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0&lt;\/script&gt;\n@endsection<\/code><\/pre>\n<p>Olet ehk\u00e4 huomannut joitakin juttuja edell\u00e4 tiedosto kuten <code>@extends('layouts.app')<\/code>, <code>@section('style')<\/code>, <code>@section('content')<\/code>jne N\u00e4m\u00e4 osiot menev\u00e4t vastaavissa paikoissa <code>app.blade.php<\/code>. K\u00e4ytt\u00e4j\u00e4 saa paremman k\u00e4sityksen siit\u00e4, kun tarkastelet t\u00e4m\u00e4n sivun l\u00e4hdett\u00e4 selaimessa.<\/p>\n<p>Voit kutsua t\u00e4m\u00e4n n\u00e4kym\u00e4n luomalla ohjaimen komennolla:<\/p>\n<pre><code>php artisan make:controller ImageController --resource<\/code><\/pre>\n<p>Lis\u00e4\u00e4 t\u00e4m\u00e4n ohjaimen viite reittitiedostoon.<\/p>\n<p><strong>reitit \/ web.php<\/strong><\/p>\n<pre><code>Route::resource('image', 'ImageController');<\/code><\/pre>\n<p>Avaa editorissa ImageController ja kutsu n\u00e4kym\u00e4tiedosto hakemistomenetelm\u00e4ll\u00e4.<\/p>\n<pre><code>&lt;?php\n\u00a0\nnamespace AppHttpControllers;\n\u00a0\nuse IlluminateHttpRequest;\nuse Image;\n\u00a0\nclass ImageController extends Controller\n{\n\u00a0\u00a0\u00a0\u00a0\/**\n\u00a0\u00a0\u00a0\u00a0\u00a0* Display a listing of the resource.\n\u00a0\u00a0\u00a0\u00a0\u00a0*\n\u00a0\u00a0\u00a0\u00a0\u00a0* @return IlluminateHttpResponse\n\u00a0\u00a0\u00a0\u00a0\u00a0*\/\n\u00a0\u00a0\u00a0\u00a0public function index()\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return view('image');\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0.....\n}<\/code><\/pre>\n<p>Suorita <code>php artisan serve<\/code>komento ja n\u00e4et lomakkeen alla olevassa URL-osoitteessa.<\/p>\n<pre><code>http:\/\/localhost:8000\/image<\/code><\/pre>\n<p>Kun lataat kuvan, sinun pit\u00e4isi n\u00e4hd\u00e4 esikatselukuva lomakkeen alla. T\u00e4st\u00e4 esikatselusta voit valita osan kuvasta, jonka haluat rajata.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20475-6081f7850f82b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20475-6081f7850f82b.png\" alt=\"Kuinka ladata ja rajata kuvaa Laravelissa k\u00e4ytt\u00e4m\u00e4ll\u00e4 imgAreaSelect- ja Intervention-kuvakirjastoa\" ><\/a><\/p>\n<h3>Lataa ja rajaa kuva k\u00e4ytt\u00e4m\u00e4ll\u00e4 interventiokuvakirjastoa<\/h3>\n<p>T\u00e4ss\u00e4 vaiheessa olemme saaneet valmiiksi asiakaspuolen koodin, jolla k\u00e4ytt\u00e4j\u00e4 voi valita osan kuvasta, jonka haluaa rajata. Seuraava ty\u00f6 on kuvan rajaaminen ja tallentaminen palvelimelle. Kuvan tallentamiseksi palvelimelle k\u00e4yt\u00e4n Laravel-tallennusominaisuutta, jossa luomme symboli linkist\u00e4 &#8217;storage&#8217; -kansioon. Voit luoda symlinkin suorittamalla komennon:<\/p>\n<pre><code>php artisan storage:link<\/code><\/pre>\n<p>T\u00e4m\u00e4 komento luo &#8217;storage&#8217; -hakemiston &#8217;public&#8217; -kansioon.<\/p>\n<p>Ohjaimeemme sis\u00e4llytimme jo julkisivun, <code>use Image;<\/code>joten sinun on hyv\u00e4 edet\u00e4 Intervention-kuvakirjaston avulla kuvan rajaamiseen palvelinpuolella. Ohjaimen <code>store()<\/code>menetelm\u00e4ll\u00e4 tulisi olla alla oleva koodi:<\/p>\n<pre><code>\/**\n\u00a0* Store a newly created resource in storage.\n\u00a0*\n\u00a0* @param\u00a0 IlluminateHttpRequest\u00a0 $request\n\u00a0* @return IlluminateHttpResponse\n\u00a0*\/\npublic function store(Request $request)\n{\n\u00a0\u00a0\u00a0\u00a0if($request-&gt;hasFile('profile_image')) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/get filename with extension\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$filenamewithextension = $request-&gt;file('profile_image')-&gt;getClientOriginalName();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/get filename without extension\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/get file extension\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$extension = $request-&gt;file('profile_image')-&gt;getClientOriginalExtension();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/filename to store\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$filenametostore = $filename.'_'.time().'.'.$extension;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Upload File\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$request-&gt;file('profile_image')-&gt;storeAs('public\/profile_images', $filenametostore);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(!file_exists(public_path('storage\/profile_images\/crop'))) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mkdir(public_path('storage\/profile_images\/crop'), 0755);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ crop image\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$img = Image::make(public_path('storage\/profile_images\/'.$filenametostore));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$croppath = public_path('storage\/profile_images\/crop\/'.$filenametostore);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$img-&gt;crop($request-&gt;input('w'), $request-&gt;input('h'), $request-&gt;input('x1'), $request-&gt;input('y1'));\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$img-&gt;save($croppath);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ you can save crop image path below in database\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$path = asset('storage\/profile_images\/crop\/'.$filenametostore);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return redirect('image')-&gt;with(['success' =&gt; \"Image cropped successfully.\", 'path' =&gt; $path]);\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>T\u00e4ss\u00e4 koodissa tallennamme kuvan rajatun version hakemistoon &#8217;public \/ storage \/ profile_images \/ crop&#8217;. Sen tallentamisen j\u00e4lkeen ohitamme rajatun kuvan polun takaisin n\u00e4kym\u00e4\u00e4n. Ja katselutiedostoon lis\u00e4simme jo koodin, joka n\u00e4ytt\u00e4\u00e4 rajatun kuvan loppuk\u00e4ytt\u00e4j\u00e4lle.<\/p>\n<h3>Aseta kuvan suurin leveys<\/h3>\n<p>Joskus k\u00e4ytt\u00e4j\u00e4t saattavat haluta m\u00e4\u00e4ritell\u00e4 kuvan rajausversiolle enimm\u00e4isleveyden. ImgAreaSelect-laajennus tarjoaa useita vaihtoehtoja, kuten aspektisuhde, maxWidth, maxHeight jne., Jotta kuvan lopputulos voidaan mukauttaa. K\u00e4ytt\u00e4j\u00e4 voi k\u00e4ytt\u00e4\u00e4 maxWidth-vaihtoehtoa muuttamalla JavaScript-koodia seuraavasti:<\/p>\n<pre><code>$('#previewimage').imgAreaSelect({\n\u00a0\u00a0\u00a0\u00a0maxWidth: '1000', \/\/ this value is in pixels\n\u00a0\u00a0\u00a0\u00a0onSelectEnd: function (img, selection) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('input[name=\"x1\"]').val(selection.x1);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('input[name=\"y1\"]').val(selection.y1);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('input[name=\"w\"]').val(selection.width);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$('input[name=\"h\"]').val(selection.height);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \n\u00a0\u00a0\u00a0\u00a0}\n});<\/code><\/pre>\n<p>Kyse on siit\u00e4, miten kuvia ladataan ja rajataan Laraveliin. Toivon, ett\u00e4 sait tiet\u00e4\u00e4 kuinka k\u00e4sitell\u00e4 kuvien rajaamista. Haluaisin kuulla ajatuksesi ja ehdotuksesi alla olevassa kommenttiosassa.<\/p>\n<h4>Aiheeseen liittyv\u00e4t artikkelit<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/fi\/muuta-kuvan-kokoa-laravelissa-kayttamalla-interventiokuvakirjastoa\/\" title=\"Muuta kuvan kokoa Laravelissa k\u00e4ytt\u00e4m\u00e4ll\u00e4 interventiokuvakirjastoa\">Muuta kuvan kokoa Laravelissa k\u00e4ytt\u00e4m\u00e4ll\u00e4 interventiokuvakirjastoa<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/fi\/kuinka-ladata-ja-pakata-kuvia-laravelissa\/\" title=\"Opas kuvien lataamiseen ja pakkaamiseen Laravelissa\">Opas kuvien lataamiseen ja pakkaamiseen Laravelissa<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/fi\/luo-pikkukuva-laraveliin-kayttamalla-interventiokuvakirjastoa\/\" title=\"Luo pikkukuva Laraveliin k\u00e4ytt\u00e4m\u00e4ll\u00e4 Interventiokuvakirjastoa\">Luo pikkukuva Laraveliin k\u00e4ytt\u00e4m\u00e4ll\u00e4 Interventiokuvakirjastoa<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4ss\u00e4 artikkelissa n\u00e4yt\u00e4mme, kuinka voit ladata ja rajata kuvaa Laravelissa. T\u00e4t\u00e4 varten k\u00e4yt\u00e4mme imgAreaSelect- ja Intervention-kuvakirjastoa.<\/p>\n","protected":false},"author":1,"featured_media":21676,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[499],"tags":[843],"class_list":["post-24795","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/posts\/24795","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/comments?post=24795"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/posts\/24795\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/media\/21676"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/media?parent=24795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/categories?post=24795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/fi\/wp-json\/wp\/v2\/tags?post=24795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}