Magento 2: Özel Modül için yeniden boyutlandırma görüntüsü nasıl alınır?


12

Magento 2 CE Sürüm 2.1.0 kullanıyorum

Görüntü Alanlı Özel Modülüm var. Yüklendiğinde, ürüne göre farklı boyutta görüntüler istiyorum Küçük Resim, Liste Görüntüsü ve Ürün Detayı Sayfa Görüntüsü var.

Yeniden boyutlandırmadan 1 resim yüklenebilir.

Resmi yeniden boyutlandırmak için aşağıdaki kodu kullanıyorum, ancak ürün resmi URL'si veriyor. Özel modülüm değil.

\ App \ kod \ Custom \ Modülü \ Blok \ MYPOSTS \ edit.php

public function getImage($posts, $image) {
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $_imagehelper = $objectManager->get('Magento\Catalog\Helper\Image');
    echo $postImage = $_imagehelper->init($posts, $image)->constrainOnly(FALSE)->keepAspectRatio(TRUE)->keepFrame(FALSE)->resize(400)->getUrl();
    exit;
}

URL http: //localhost/magento2/pub/static/frontend/Magento/luma/en_US/Magento_Catalog/images/product/placeholder/.jpg

Benim resmi burada depolanır: \magento2\pub\media\custom_module\posts\image.

Bu yolla yeniden boyutlandırma görüntüsünü nasıl alabilirim ve farklı boyuttaki görüntüyü nasıl kaydedebilir / alabilirim?

Yanıtlar:


16

Magento 2'de Özel Görüntüyü Yeniden Boyutlandır'ı tıklayarak ayrıntıları kontrol edebilirsiniz.

İç Blok dosyası kodun altında kalsın,

   protected $_filesystem ;
   protected $_imageFactory;
   public function __construct(            
        \Magento\Framework\Filesystem $filesystem,         
        \Magento\Framework\Image\AdapterFactory $imageFactory         
        ) {         
        $this->_filesystem = $filesystem;               
        $this->_imageFactory = $imageFactory;         
        }

    // pass imagename, width and height
    public function resize($image, $width = null, $height = null)
    {
        $absolutePath = $this->_filesystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA)->getAbsolutePath('custom_module/posts/').$image;
        if (!file_exists($absolutePath)) return false;
        $imageResized = $this->_filesystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA)->getAbsolutePath('resized/'.$width.'/').$image;
        if (!file_exists($imageResized)) { // Only resize image if not already exists.
            //create image factory...
            $imageResize = $this->_imageFactory->create();         
            $imageResize->open($absolutePath);
            $imageResize->constrainOnly(TRUE);         
            $imageResize->keepTransparency(TRUE);         
            $imageResize->keepFrame(FALSE);         
            $imageResize->keepAspectRatio(TRUE);         
            $imageResize->resize($width,$height);  
            //destination folder                
            $destination = $imageResized ;    
            //save image      
            $imageResize->save($destination);         
        } 
        $resizedURL = $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA).'resized/'.$width.'/'.$image;
        return $resizedURL;
  } 

Şimdi phtml dosyasının içinde arayın,

$block->resize('test.jpg',500,400);

Bravo. Mükemmel çalışıyor. Resim Ekle sırasında farklı boyutlarda yükleme yapmak zorunda değiliz. Sadece görüntülerken doğru @Rakesh'i yönetmeliyiz?
Ankit Shah

1
evet o zaman göstermek zorundayken yönetmek.
Rakesh Jesadiya

1 resmi yeniden boyutlandırmaya ve aynı resim ile aynı klasöre koymaya çalıştığımızda çalışmaz. bunun gibi: $ absolutePath = $ this -> _ dosya sistemi-> getDirectoryRead (\ Magento \ Framework \ App \ Filesystem \ DirectoryList :: MEDIA) -> getRelativePath ('C: / xampp / htdocs / magento / app / code / Aht / BannerSlider /view/frontend/web/').$image; $ imageResized = $ this -> _ dosya sistemi-> getDirectoryRead (\ Magento \ Framework \ App \ Filesystem \ DirectoryList :: MEDIA) -> getRelativePath ('C: / xampp / htdocs / magento / app / code / Aht / BannerSlider / view / ön / ağ /').$ görüntüsü;
fudu

Daha önce de belirtildiği gibi, bu kabul edilen cevap olmamalıdır. Tüm bunları kendiniz yapmanız gerekmez - Magento çekirdeğinin mevcut görüntü yardımcısını kullanın.
fritzmg

@ RakeshJesadiya, bana bir url olarak bilinmeyen metin veriyor
Hitesh Balpande

13

Kabul edilen cevap, performansı artırmak için görüntüyü önbelleğe almayı dikkate almaz. Her istendiğinde görüntüyü yeniden boyutlandırmanız ve üzerine yazmanız gerekmez. Aşağıdaki yaklaşım, yeniden boyutlandırılan görüntüyü "önbellek" klasörüne kaydeder, böylece ardışık aramalar görüntüyü önbellekten döndürür. Yöntem, bir yardımcıda (blok değil) bulunur, böylece istediğiniz herhangi bir şablondan çağırabilirsiniz:

Uygulamanın / kod / Satıcı / Namespace / Yardımcı / image.php

<?php

namespace Vendor\Namespace\Helper;

use Magento\Framework\App\Filesystem\DirectoryList;

class Image extends \Magento\Framework\App\Helper\AbstractHelper
{
    /**
     * Custom directory relative to the "media" folder
     */
    const DIRECTORY = 'custom_module/posts';

    /**
     * @var \Magento\Framework\Filesystem\Directory\WriteInterface
     */
    protected $_mediaDirectory;

    /**
     * @var \Magento\Framework\Image\Factory
     */
    protected $_imageFactory;

    /**
     * Store manager
     *
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $_storeManager;

    /**
     * @param \Magento\Framework\App\Helper\Context $context
     * @param \Magento\Framework\Filesystem $filesystem
     * @param \Magento\Framework\Image\Factory $imageFactory
     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
     */
    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Framework\Filesystem $filesystem,
        \Magento\Framework\Image\AdapterFactory $imageFactory,
        \Magento\Store\Model\StoreManagerInterface $storeManager
    ) {
        $this->_mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
        $this->_imageFactory = $imageFactory;
        $this->_storeManager = $storeManager;
        parent::__construct($context);
    }

    /**
     * First check this file on FS
     *
     * @param string $filename
     * @return bool
     */
    protected function _fileExists($filename)
    {
        if ($this->_mediaDirectory->isFile($filename)) {
            return true;
        }
        return false;
    }

    /**
     * Resize image
     * @return string
     */
    public function resize($image, $width = null, $height = null)
    {
        $mediaFolder = self::DIRECTORY;

        $path = $mediaFolder . '/cache';
        if ($width !== null) {
            $path .= '/' . $width . 'x';
            if ($height !== null) {
                $path .= $height ;
            }
        }

        $absolutePath = $this->_mediaDirectory->getAbsolutePath($mediaFolder) . $image;
        $imageResized = $this->_mediaDirectory->getAbsolutePath($path) . $image;

        if (!$this->_fileExists($path . $image)) {
            $imageFactory = $this->_imageFactory->create();
            $imageFactory->open($absolutePath);
            $imageFactory->constrainOnly(true);
            $imageFactory->keepTransparency(true);
            $imageFactory->keepFrame(true);
            $imageFactory->keepAspectRatio(true);
            $imageFactory->resize($width, $height);
            $imageFactory->save($imageResized);
        }

        return $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . $path . $image;
    }
}

Şimdi herhangi bir .phtml şablonundan yöntemi şu şekilde çağırabilirsiniz:

<!-- Get a reference to the Image helper -->
<?php $image = $this->helper('Vendor\Namespace\Helper\Image'); ?>
.
.
.
<!-- Resize the image by specifying width only -->
<img src="<?php echo $image->resize('/my-picture.jpg', 1200); ?>">

<!-- Resize the image by specifying width and height -->
<img src="<?php echo $image->resize('/my-picture.jpg', 640, 480); ?>">

Varsa, orijinal dosya için bir kontrol eklemeyi önerebilir miyim? Yeniden boyutlandırma () işlevinde: Ne değişti if (!$this->_fileExists($path . $image)) {etmekif (!$this->_fileExists($path . $image) && $this->_fileExists($mediaFolder . $image)) {
Alexandru Bangala

Bir cazibe gibi çalış, teşekkürler. Bu kabul edilen cevap olmalı
fudu

Mevcut olanı da kullanabilirsiniz \Magento\Catalog\Helper\Image.
fritzmg

2
@fritzmg Bu yardımcı sadece ürün resimleri için tasarlanmamış mı? Ürün imajı olmayan, / modül / media klasörüne özel modülle yüklenen ve ürünle ilişkisi olmayan görüntü ile nasıl kullanabilirim?
kovinet

1
@kovinet - Orijinal görüntü pub / media / klasöründe olduğu sürece herhangi bir görüntü ile çalışır. Görüntünün yolunu $ image-> resize ('image / path / filename.ext') 'e iletmeniz yeterlidir;
Daniel Kratohvil

3

Magento yardımcıları zaten sahip olduğundan, resimlerinizi yeniden boyutlandırmak için yeni sınıflar oluşturmanız gerekmediğinden korkuyorum (bkz. \Magento\Catalog\Helper\Image::resize).

Yani, şunları yapabilirsiniz:

$_imageHelper = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Catalog\Helper\Image');

echo $_imageHelper->init($product, 'small_image', ['type'=>'small_image'])->keepAspectRatio(true)->resize('65','65')->getUrl();

Bu kullanımın bir örneğini de görebilirsiniz \Magento\VisualMerchandiser\Block\Adminhtml\Category\Merchandiser\Tile::getImageUrl(Magento EE sadece sanırım)


Ancak örneğiniz yalnızca ürün resimleriyle çalışır, değil mi? Soru, Görüntü alanına sahip özel modül hakkındadır. Yani $product/ media içindeki görüntü dosyasına giden yoldan başka bir yol yoktur .
kovinet

Haklısın @kovinet. O zaman fark etmedim. Ancak, bu iş parçacığı bana ürün görüntüleri konusunda yardımcı oldu ve başkalarına yardımcı olduğu görülüyor. Ama yorumunuz için teşekkür ederim. Biraz zamanım olduğunda, daha iyi bir cevap arayacağım. ;)
Ricardo Martins

1

resizeÖzgün resim boyutunuza bağlı olarak kırpma değerlerini üstten ve alttan veya soldan ve sağdan hesaplamanız gerektiğinden , yöntemin görüntüyü boyutlarıma kırpmayacağı bir sorunla karşılaştım . @Rakesh kodunu kullandım ve orijinal görüntünün daha uzun veya daha geniş olup olmadığını kontrol eder ve buna göre kırpar:

public function resize($image, $width = null, $height = null)
{
    $mediaFolder = self::DIRECTORY;

    $path = $mediaFolder . 'cache';
    if ($width !== null) {
        $path .= '/' . $width . 'x';
        if ($height !== null) {
            $path .= $height ;
        }
    }

    $absolutePath = $this->_mediaDirectory->getAbsolutePath($mediaFolder) . $image;
    $imageResized = $this->_mediaDirectory->getAbsolutePath($path) . $image;

    if (!$this->_fileExists($path . $image) && $this->_fileExists($mediaFolder . $image)) {
        $imageFactory = $this->_imageFactory->create();
        $imageFactory->open($absolutePath);
        $imageFactory->constrainOnly(true);
        $imageFactory->keepAspectRatio(true);
        $imageFactory->keepFrame(false);

        $originalWidth = $imageFactory->getOriginalWidth();
        $originalHeight = $imageFactory->getOriginalHeight();

        $oldAspectRatio = $originalWidth / $originalHeight;
        $newAspectRatio = $width / $height;

        if ($oldAspectRatio > $newAspectRatio) {
            // original image is wider than the desired dimensions
            $imageFactory->resize(null, $height);
            $crop = ($imageFactory->getOriginalWidth() - $width) / 2;
            $imageFactory->crop(0, $crop, $crop, 0);
        } else {
            // it's taller...
            $imageFactory->resize($width, null);
            $crop = ($imageFactory->getOriginalHeight() - $height) / 2;
            $imageFactory->crop($crop, 0, 0, $crop);
        }

        $imageFactory->save($imageResized);

    }

    return $this->_storeManager
            ->getStore()
            ->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . $path . $image;
}

0

@Rakesh - Ben aynı şeyi yaptım ama benim için çalışmıyor bir hata var

Blockquote Hata filtreleme şablonu: Uyarı: getimagesize (/var/www/html/sitename/pub/media/onecategory/6/7/671471390.jpg): akış açılamadı: / var / www / html'de böyle bir dosya veya dizin yok /sitename/vendor/magento/framework/Image/Adapter/AbstractAdapter.php on line 304

bana bu konuda yardım edebilir misin?

Teşekkür ederim.


Çözümü buluyor musunuz? Çünkü şu an senin durumundayım. :(
fudu

lütfen klasör veya dosya iznini kontrol edin.
Sarfaraj Sipai

klasöründe Aht_BannerSlider / images / slide_1.jpg dosyası yok: /xampp/htdocs/magento/pub/media/Aht_BannerSlider/images/slide_1.jpg ve ayrıca pub klasörü için izin verdim.
fudu

Ve hala çalışmıyor. :(
fudu

lütfen bu sayfadaki son yanıtı kontrol edin.
Sarfaraj Sipai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.