Magento 2: कस्टम मॉड्यूल के लिए आकार बदलने की छवि कैसे प्राप्त करें?


12

मैं Magento 2 CE संस्करण 2.1.0 का उपयोग कर रहा हूं

मेरे पास छवि क्षेत्र के साथ कस्टम मॉड्यूल है। जब इसे अपलोड किया जाता है, तो मुझे अलग-अलग आकार की छवियां चाहिए, जैसे कि हमारे पास उत्पाद के लिए थंबनेल छवि, सूची छवि और उत्पाद विवरण पृष्ठ छवि है।

आकार बदलने के बिना 1 छवि अपलोड करने में सक्षम।

मैं छवि को आकार देने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं, लेकिन यह उत्पाद छवि URL दे रहा है। मेरा कस्टम मॉड्यूल नहीं।

\ एप्लिकेशन \ कोड \ कस्टम \ मॉड्यूल \ ब्लॉक \ 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

मेरी छवि यहां संग्रहीत की जाती: \magento2\pub\media\custom_module\posts\image

मैं इस पथ के साथ आकार परिवर्तन कैसे प्राप्त कर सकता / सकती हूं और विभिन्न आकार की छवि को कैसे सहेज / पुनः प्राप्त कर सकता हूं?

जवाबों:


16

आप क्लिक करके विवरणों की जांच कर सकते हैं, Magento 2 में कस्टम छवि का आकार बदलें

ब्लॉक फ़ाइल के अंदर कोड रखें,

   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;
  } 

अब phtml फ़ाइल के अंदर कॉल करें,

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

वाहवाही। अच्छी तरह से काम। इसलिए Add Image करते समय हमें विभिन्न आकारों के साथ अपलोड करने की आवश्यकता नहीं है। केवल प्रदर्शित करते समय हमें सही @ राकेश को प्रबंधित करना होगा?
अंकित शाह 6

1
हां, जब हमें उस समय को प्रदर्शित करना है तो प्रबंधित करें।
राकेश जेसादिया 6

जब हम 1 छवि का आकार बदलने की कोशिश करते हैं और इसे एक ही छवि वाले फ़ोल्डर में नहीं डालते हैं तो यह काम नहीं करता है। इस तरह: $ निरपेक्ष = $ इस -> _ फाइल सिस्टम-> getDirectoryRead (\ Magento \ फ्रेमवर्क \ App \ Filesystem \ DirectoryList :: मीडिया) -> getRelativePath ('C: / xbpp / htdocs / magento / app / code / Aht / BannerSlider /view/frontend/web/').$image; $ ImageResized = $ यह -> _ filesystem-> getDirectoryRead (\ Magento \ Framework \ App \ Filesystem \ DirectoryList :: MEDIA) -> getRelativePath ('C: / xampp / htdocs / magento / app / code / Aht / BannerSlider / view / view / दृश्यपटल / वेब /').$ छवि;
fudu

जैसा कि पहले ही उल्लेख किया गया है, यह स्वीकृत उत्तर नहीं होना चाहिए। आपको यह सब स्वयं करने की आवश्यकता नहीं है - बस Magento कोर के पहले से मौजूद छवि सहायक का उपयोग करें।
fritzmg

@ राकेशजेसदिया, इसका मुझे एक अज्ञात पाठ के रूप में दे रहा है url
हितेश बालपांडे

13

स्वीकृत उत्तर प्रदर्शन को बेहतर बनाने के लिए छवि को कैशिंग करने पर विचार नहीं करता है। हर बार आपके द्वारा अनुरोधित छवि को आकार बदलने और अधिलेखित करने की आवश्यकता नहीं है। निम्नलिखित दृष्टिकोण एक "कैश" फ़ोल्डर में रिसाइज्ड छवि को सहेजता है इसलिए लगातार कॉल कैश से छवि को वापस करते हैं। विधि एक सहायक (एक ब्लॉक नहीं) पर निहित है ताकि आप इसे किसी भी टेम्पलेट से पसंद कर सकें जिसे आप चाहें:

एप्लिकेशन / कोड / विक्रेता / नाम स्थान / हेल्पर / 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;
    }
}

अब किसी भी .phtml टेम्पलेट से आप इस तरह विधि को कॉल कर सकते हैं:

<!-- 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); ?>">

क्या मैं मूल फ़ाइल के लिए एक चेक जोड़ने का सुझाव दे सकता हूं, यदि यह मौजूद नहीं है? resize () फ़ंक्शन में: मैं बदल if (!$this->_fileExists($path . $image)) {गयाif (!$this->_fileExists($path . $image) && $this->_fileExists($mediaFolder . $image)) {
अलेक्जेंड्रू बंगालो

एक आकर्षण की तरह काम करते हैं, धन्यवाद। यह स्वीकृत उत्तर होना चाहिए
3

आप बस मौजूदा का उपयोग कर सकते हैं \Magento\Catalog\Helper\Image
fritzmg

2
@fritzmg यह सहायक केवल उत्पाद छवियों के लिए नहीं है? मैं इसे कस्टम छवि के साथ कैसे उपयोग कर सकता हूं जो उत्पाद छवि नहीं है, लेकिन कस्टम मॉड्यूल / पब / मीडिया फ़ोल्डर के साथ अपलोड की गई छवि और उत्पाद से कोई संबंध नहीं है?
कोविनेट

1
@ कोविनेट - यह किसी भी छवि के साथ काम करता है जब तक कि मूल छवि पब / मीडिया / फ़ोल्डर के भीतर समाहित है। $ छवि के लिए छवि का पथ पास करें-> आकार बदलें ('छवि / पथ / फ़ाइल नाम। कस्टम');
डैनियल क्रतोहविल

3

मुझे डर है कि आपको अपनी छवियों को आकार देने के लिए नई कक्षाएं बनाने की आवश्यकता नहीं है, क्योंकि मैगेंटो सहायकों के पास पहले से ही यह है (देखें \Magento\Catalog\Helper\Image::resize)।

तो, आप बस कर सकते हैं:

$_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();

आप इस उपयोग का एक उदाहरण भी देख सकते हैं \Magento\VisualMerchandiser\Block\Adminhtml\Category\Merchandiser\Tile::getImageUrl(Magento EE केवल मुझे लगता है)


लेकिन आपका उदाहरण केवल उत्पाद छवियों के साथ काम करेगा, है ना? सवाल छवि क्षेत्र के साथ कस्टम मॉड्यूल के बारे में है। इसलिए $product/ मीडिया में छवि फ़ाइल के लिए कोई रास्ता नहीं है ।
कोविनेट

आप सही हैं @ कोविनेट। मैंने इसे उस समय नोटिस नहीं किया था। हालांकि, इस धागे ने मुझे उत्पाद छवियों के साथ मदद की, और ऐसा लगता है कि यह दूसरों की मदद कर रहा है। लेकिन आपकी टिप्पणी के लिए धन्यवाद। जैसे ही मेरे पास कुछ समय होगा, मैं बेहतर उत्तर की तलाश करूँगा। ;)
रिकार्डो मार्टिंस

1

मुझे एक समस्या का सामना करना पड़ा है, जहां resizeविधि मेरे आयामों के लिए छवि को क्रॉप नहीं करेगी, इसलिए आपको अपने मूल छवि आकार के आधार पर, ऊपर और नीचे या बाएं और दाएं से फसल मूल्यों की गणना करने की आवश्यकता है। मैंने @ राकेश के कोड का उपयोग किया और इसे संशोधित किया ताकि यह जांच सके कि मूल छवि लंबी है या व्यापक और फसलों के अनुसार:

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

@ राकेश - मैंने भी ऐसा ही किया है, लेकिन यह मेरे लिए काम नहीं कर रहा है, एक त्रुटि है

अवरोधक त्रुटि फ़िल्टरिंग टेम्प्लेट: चेतावनी: getimagesize (/var/www/sitename/pub/media/onecategory/6/7/671471390.jpg): स्ट्रीम खोलने में विफल: ऐसी कोई फ़ाइल या निर्देशिका / var / www / html / html में निर्देशिका लाइन पर 304

क्या आप इसमें मेरी मदद कर सकते हैं

धन्यवाद।


क्या आप इसका हल ढूंढते हैं? क्योंकि मैं अब आपकी स्थिति में हूं। :(
फुडू

कृपया फ़ोल्डर या फ़ाइल अनुमति की जाँच करें।
सरफराज सिपाई १४'१ S को

फ़ोल्डर में Aht_BannerSlider / images / Slide_1.jpg नहीं है C: /xampp/htdocs/magento/pub/media/Aht_BannerSlider/images/slide_1.jpg, और इसके अलावा मैंने सिर्फ पब फ़ोल्डर की अनुमति दी है।
फुडू

और फिर भी काम नहीं करता है। :(
फुडू

कृपया इस पृष्ठ पर अंतिम उत्तर देखें।
सरफराज सिपाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.