Magento обрезать изображение? - PullRequest
1 голос
/ 29 февраля 2012

Я нашел это: http://docs.magentocommerce.com/Varien/Varien_Image/Varien_Image.html#crop

Но я не уверен, что это устарело или что-то еще, потому что, когда я попробовал это:

echo rawurlencode($this->helper('catalog/image')->init($_product, 'image')->constrainOnly(TRUE)->keepAspectRatio(TRUE)->keepFrame(FALSE)->setWatermarkImageOpacity(0)->crop(10, 20, 30, 40)->resize(300, null))

Это не работает и выдает мне эту ошибку:

Fatal error:  Call to undefined method Mage_Catalog_Helper_Image::crop() in /home/xxxxx/public_html/app/design/frontend/default/xxxxx/template/catalog/product/view.phtml

Так действительно ли метод crop () вообще применим? Если да, то как я могу использовать его, чтобы обрезать (не путать с изменением размера) изображения продуктов Magento? Спасибо!

Ответы [ 3 ]

5 голосов
/ 29 февраля 2012

Ваша ошибка в предположении, что $this->helper('catalog/image')->init($_product, 'image') возвращает экземпляр Varien_Image, хотя на самом деле задействованы два промежуточных класса:
Mage_Catalog_Helper_Image и Mage_Catalog_Model_Product_Image.

Помощник catalog/image является беспорядком, хотя в последних версиях он был немного убран (например, больше нет частных методов). Тем не менее, некоторые геттеры все еще защищены, и в этом нет реальной необходимости.
Вот мой обходной путь:

/* @var $imageHelper Mage_Catalog_Helper_Image */
// Initialize the image helper
$imageHelper = Mage::helper('catalog/image')->init($_product, 'image')
        ->constrainOnly(true)
        ->keepAspectRatio(true)
        ->keepFrame(false)
        ->setWatermarkImageOpacity(0);

// Get the catalog/product_image instance
/* @var $imageModel Mage_Catalog_Model_Product_Image */
$reflection = new ReflectionClass($imageHelper);
$property = $reflection->getProperty('_model');
$property->setAccessible(true);
$imageModel = $property->getValue($imageHelper);

// Initialize the missing values on the image model
// Usually done in Mage_Catalog_Helper_Image::__toString()
if (! $imageModel->isCached())
{
    $getWatermarkMethod = $reflection->getMethod('getWatermark');
    $getWatermarkMethod->setAccessible(true);
    $imageModel->setBaseFile($_product->getImage())
        ->resize()
        ->setWatermark($getWatermarkMethod->invoke($imageHelper));

    // Crop the image using the image processor
    // $imageModel->getImageProcessor() returns a Varien_Image instance
    $imageModel->getImageProcessor()->crop(10, 20, 30, 40);

    // Generate the image according to the set parameters and
    // get the URL while bypassing the helper to avoid reinitialization
    $url = $imageModel->saveFile()->getUrl();
}
echo $url . "\n";

Было бы проще использовать модель catalog/product_image или Varien_Image напрямую, но таким образом все настройки водяного знака Magento по-прежнему применяются.
В любом случае не чисто.
Я надеюсь, что получатели на помощнике будут обнародованы в будущих выпусках.

3 голосов
/ 03 марта 2012

Вот альтернативный метод (кредиты от Onlinebizsoft.com) Следующий код сначала просматривает изображение, которое доступно в каталоге / resize, если его там нет, делает все остальное.

// actual path of image
$_imageUrl = Mage::getBaseDir('media').DS."myimage".DS.$post->getThumbnail();

// path of the resized image to be saved
// here, the resized image is saved in media/resized folder
$imageResized =  Mage::getBaseDir('media').DS."myimage".DS."resized".DS.$post->getThumbnail();

// resize image only if the image file exists and the resized image file doesn't exist
// the image is resized proportionally with the width/height 135px
if (!file_exists($imageResized)&&file_exists($_imageUrl)) :
    $imageObj = new Varien_Image($_imageUrl);
    $imageObj->constrainOnly(TRUE);
    $imageObj->keepAspectRatio(TRUE);
    $imageObj->keepFrame(FALSE);
    $imageObj->resize(135, 135);
    $imageObj->save($imageResized);
endif;

Проверка веб-сайта Изменение размера - масштабирование изображений Crop

0 голосов
/ 29 февраля 2012

Вы пробовали класс Varien_Image?

$image = new Varien_Image($img);
$cropped = $image->crop();
...