{"id":28390,"date":"2021-05-25T11:02:00","date_gmt":"2021-05-25T08:02:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=28390"},"modified":"2021-10-18T03:42:14","modified_gmt":"2021-10-18T00:42:14","slug":"utworz-miniature-w-laravel-za-pomoca-biblioteki-obrazow-interwencyjnych","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pl\/utworz-miniature-w-laravel-za-pomoca-biblioteki-obrazow-interwencyjnych\/","title":{"rendered":"Utw\u00f3rz miniatur\u0119 w Laravel za pomoc\u0105 biblioteki obraz\u00f3w interwencyjnych"},"content":{"rendered":"<p>Na stronie zawsze zajmujemy si\u0119 obrazami. W zale\u017cno\u015bci od wymaga\u0144 u\u017cywamy r\u00f3\u017cnych wersji obraz\u00f3w. Dobr\u0105 praktyk\u0105 dla programist\u00f3w jest tworzenie r\u00f3\u017cnych wersji, czyli miniaturek pojedynczego obrazu. Te miniatury mog\u0105 by\u0107 u\u017cywane podczas wy\u015bwietlania obraz\u00f3w o r\u00f3\u017cnych rozmiarach w zale\u017cno\u015bci od rozmiaru kontenera. Wy\u015bwietlanie obrazu dopasowanego do rozmiaru kontenera oszcz\u0119dzi przepustowo\u015b\u0107 i skr\u00f3ci czas \u0142adowania strony. Wy\u015bwietlanie obrazu o du\u017cym rozmiarze w ma\u0142ym kontenerze to z\u0142a praktyka i skraca czas wczytywania strony. W rezultacie zaleca si\u0119 tworzenie wielu miniatur obrazu i u\u017cywanie odpowiedniej wersji tam, gdzie jest to konieczne.<\/p>\n<p>W tym artykule dowiemy si\u0119, jak utworzy\u0107 miniatur\u0119 w Laravel za pomoc\u0105 biblioteki obraz\u00f3w interwencyjnych. <a href=\"http:\/\/image.intervention.io\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Intervention Image<\/a> jest darmow\u0105 i jedn\u0105 z popularnych bibliotek do manipulacji obrazami. W tle ta biblioteka u\u017cywa Biblioteki GD i Imagick do manipulacji obrazami.<\/p>\n<p>W tym samouczku stworz\u0119 3 miniatury \u2013 ma\u0142\u0105, \u015bredni\u0105, du\u017c\u0105 o rozmiarach odpowiednio 150 93, 300*185, 550 340. Zmie\u0144 te rozmiary zgodnie z wymaganiami.<\/p>\n<h3>Pierwsze kroki<\/h3>\n<p>Aby rozpocz\u0105\u0107, musisz najpierw zainstalowa\u0107 bibliotek\u0119 Intervention Image w Laravel. Otw\u00f3rz terminal w katalogu g\u0142\u00f3wnym projektu i uruchom poni\u017csze polecenie:<\/p>\n<pre><code>composer require intervention\/image<\/code><\/pre>\n<p>Po zainstalowaniu biblioteki otw\u00f3rz <code>config\/app.php<\/code>plik i dodaj do niego nast\u0119puj\u0105ce wiersze.<\/p>\n<p>Dodaj dostawc\u00f3w us\u0142ug dla tego pakietu w <code>$providers<\/code>tablicy.<\/p>\n<pre><code>InterventionImageImageServiceProvider::class<\/code><\/pre>\n<p>Dodaj fasad\u0119 do <code>$aliases<\/code>szyku.<\/p>\n<pre><code>'Image' =&gt; InterventionImageFacadesImage::class<\/code><\/pre>\n<p>Nast\u0119pnie, aby przechowywa\u0107 obrazy, musimy utworzy\u0107 katalog. Udaj si\u0119 do terminala i uruchom polecenie w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre><code>php artisan storage:link<\/code><\/pre>\n<p>To polecenie tworzy katalog przechowywania (dowi\u0105zanie symboliczne) w folderze publicznym. W tym folderze prze\u015bl\u0119 oryginalny obraz i jego miniatury.<\/p>\n<h3>Utw\u00f3rz miniatur\u0119 w Laravel<\/h3>\n<p>Wszyscy ustawili\u015bmy podstawow\u0105 konfiguracj\u0119 i mo\u017cemy teraz napisa\u0107 rzeczywisty kod. Utw\u00f3rzmy formularz w pliku widoku.<\/p>\n<pre><code>&lt;form action=\"{{ url('PASS_ACTION_URL') }}\" method=\"post\" enctype=\"multipart\/form-data\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;div class=\"form-group\"&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label for=\"exampleInputFile\"&gt;File input&lt;\/label&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"file\" name=\"profile_image\" id=\"exampleInputFile\"&gt;\n\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;\n\u00a0\u00a0\u00a0\u00a0{{ csrf_field() }}\n\u00a0\u00a0\u00a0\u00a0&lt;button type=\"submit\" class=\"btn btn-default\"&gt;Submit&lt;\/button&gt;\n&lt;\/form&gt;<\/code><\/pre>\n<p>W kontrolerze nale\u017cy doda\u0107 fasad\u0119 biblioteki 'Image&#8217; kt\u00f3r\u0105 dodali\u015bmy w <code>config\/app.php<\/code>pliku.<\/p>\n<pre><code>&lt;?php\n\u00a0\u00a0\nnamespace AppHttpControllers;\n\u00a0\u00a0\nuse IlluminateHttpRequest;\nuse Image;\n\u00a0\u00a0\nclass ImageController extends Controller\n{\n\u00a0\u00a0\n}<\/code><\/pre>\n<p>Dodaj\u0105c fasad\u0119 jeste\u015bmy w stanie wywo\u0142a\u0107 funkcje biblioteki obraz\u00f3w interwencyjnych. W poni\u017cszym kodzie wrzuc\u0119 obrazek w dw\u00f3ch miejscach. Oryginalny obraz trafia bezpo\u015brednio do <code>storage\/profile_images<\/code>folderu. Miniatury b\u0119d\u0105 przechowywane w <code>storage\/profile_images\/thumbnail<\/code>katalogu. Najpierw przesy\u0142amy oryginalny obraz do folderu miniatur, a nast\u0119pnie zmieniamy jego rozmiar.<\/p>\n<pre><code>public 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\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\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\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\/\/small thumbnail name\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$smallthumbnail = $filename.'_small_'.time().'.'.$extension;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/medium thumbnail name\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$mediumthumbnail = $filename.'_medium_'.time().'.'.$extension;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/large thumbnail name\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$largethumbnail = $filename.'_large_'.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\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$request-&gt;file('profile_image')-&gt;storeAs('public\/profile_images\/thumbnail', $smallthumbnail);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$request-&gt;file('profile_image')-&gt;storeAs('public\/profile_images\/thumbnail', $mediumthumbnail);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$request-&gt;file('profile_image')-&gt;storeAs('public\/profile_images\/thumbnail', $largethumbnail);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/create small thumbnail\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$smallthumbnailpath = public_path('storage\/profile_images\/thumbnail\/'.$smallthumbnail);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;createThumbnail($smallthumbnailpath, 150, 93);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/create medium thumbnail\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$mediumthumbnailpath = public_path('storage\/profile_images\/thumbnail\/'.$mediumthumbnail);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;createThumbnail($mediumthumbnailpath, 300, 185);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/create large thumbnail\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$largethumbnailpath = public_path('storage\/profile_images\/thumbnail\/'.$largethumbnail);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$this-&gt;createThumbnail($largethumbnailpath, 550, 340);\n\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return redirect('image')-&gt;with('success', \"Image uploaded successfully.\");\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>W powy\u017cszym kodzie przechowuj\u0119 obraz w 3 formatach ma\u0142y, \u015bredni i du\u017cy. Po ich zapisaniu wywo\u0142ujemy metod\u0119 <code>createThumbnail<\/code>i przekazujemy do metody wymagan\u0105 szeroko\u015b\u0107, wysoko\u015b\u0107. Zdefiniujmy t\u0119 funkcj\u0119 poni\u017cej. Ta funkcja powinna przej\u015b\u0107 do tego samego kontrolera.<\/p>\n<pre><code>\/**\n\u00a0* Create a thumbnail of specified size\n\u00a0*\n\u00a0* @param string $path path of thumbnail\n\u00a0* @param int $width\n\u00a0* @param int $height\n\u00a0*\/\npublic function createThumbnail($path, $width, $height)\n{\n\u00a0\u00a0\u00a0\u00a0$img = Image::make($path)-&gt;resize($width, $height, function ($constraint) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$constraint-&gt;aspectRatio();\n\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0$img-&gt;save($path);\n}<\/code><\/pre>\n<p>Tutaj proporcjonalnie zmieniamy rozmiar obrazu. W ten spos\u00f3b zachowujemy proporcje, a obraz nie zostanie obci\u0119ty.<\/p>\n<p>Je\u015bli szukasz twardej uprawy, zamie\u0144 poni\u017csze linie<\/p>\n<pre><code>$img = Image::make($path)-&gt;resize($width, $height, function ($constraint) {\n\u00a0\u00a0\u00a0\u00a0$constraint-&gt;aspectRatio();\n});\n$img-&gt;save($path);<\/code><\/pre>\n<p>Z<\/p>\n<pre><code>$img = Image::make($path)-&gt;resize($width, $height)-&gt;save($path);<\/code><\/pre>\n<p>Mam nadziej\u0119, \u017ce rozumiesz, jak stworzy\u0107 miniatur\u0119 w Laravel za pomoc\u0105 biblioteki obraz\u00f3w interwencyjnych. Chcia\u0142bym us\u0142ysze\u0107 twoje przemy\u015blenia w sekcji komentarzy poni\u017cej.<\/p>\n<h4>Powi\u0105zane artyku\u0142y<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/zmien-rozmiar-obrazu-w-laravel-za-pomoca-biblioteki-obrazow-interwencyjnych\/\" title=\"Zmie\u0144 rozmiar obrazu w Laravel za pomoc\u0105 biblioteki obraz\u00f3w interwencyjnych\">Zmie\u0144 rozmiar obrazu w Laravel za pomoc\u0105 biblioteki obraz\u00f3w interwencyjnych<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/jak-przesylac-i-kompresowac-obrazy-w-laravel\/\" title=\"Przewodnik po przesy\u0142aniu i kompresowaniu obraz\u00f3w w Laravel\">Przewodnik po przesy\u0142aniu i kompresowaniu obraz\u00f3w w Laravel<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/przeslij-i-zmien-rozmiar-wielu-obrazow-w-laravel\/\" title=\"Prze\u015blij i zmie\u0144 rozmiar wielu obraz\u00f3w w Laravel\">Prze\u015blij i zmie\u0144 rozmiar wielu obraz\u00f3w w Laravel<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Czy chcesz stworzy\u0107 miniatur\u0119 w Laravel podczas przesy\u0142ania obrazu? W tym artykule dowiemy si\u0119, jak tworzy\u0107 wiele miniatur przy u\u017cyciu obrazu interwencyjnego<\/p>\n","protected":false},"author":1,"featured_media":21673,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[501],"tags":[847],"class_list":["post-28390","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/28390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/comments?post=28390"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/28390\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media\/21673"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media?parent=28390"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/categories?post=28390"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/tags?post=28390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}