array('width' => 195, 'height' => 130), 'thumbnail' => array('width' => 150, 'height' => 150), 'medium' => array('width' => 300, 'height' => 200), 'large' => array('width' => 1024, 'height' => 682), 'post-thumbnail' => array('width' => 825, 'height' => 510) ); public static $downsizePercents = [25, 50, 75]; /** * Constructor */ public function __construct( \Magento\Framework\App\Helper\Context $context, \Magento\Framework\Filesystem $filesystem, \Magento\Framework\Image\Factory $imageFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Catalog\Block\Product\ImageBuilder $imageBuilder, \Magento\Catalog\Helper\Image $catalogImageHelper, \Magento\Catalog\Helper\Product $catalogProductHelper, \Magento\Catalog\Model\ProductFactory $productFactory, \Magento\Catalog\Model\Product\Media\Config $productMediaConfig, \Magento\Cms\Helper\Wysiwyg\Images $galleryImagesHelper ) { $this->_imageFactory = $imageFactory; $this->_storeManager = $storeManager; $this->_imageBuilder = $imageBuilder; $this->_catalogImageHelper = $catalogImageHelper; $this->_catalogProductHelper = $catalogProductHelper; $this->_productFactory = $productFactory; $this->_productMediaConfig = $productMediaConfig; $this->_galleryImagesHelper = $galleryImagesHelper; parent::__construct($context); $this->_directory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA); $this->_directory->create(self::IMAGE_DIR); } /** * Get images directory * * @return string */ public function getImageDir() { return self::IMAGE_DIR; } /** * Get image thumbs directory * * @return string */ public function getImageThumbDir() { return self::IMAGE_THUMB_DIR; } /** * Resize image * * @param string $fileName * @param int $width * @param int $height * @return string Resized image url */ public function resizeImg($fileName, $width, $height = '', $targetPath = false) { $fileName = $this->imageClean($fileName); if (strpos($fileName, '//') !== false && strpos($fileName, $this->imageBaseUrl()) === false) { return $fileName; } if ( ! $height) { $height = $width; } $thumbDir = self::IMAGE_THUMB_DIR; $resizeDir = $thumbDir . "/resized_{$width}x{$height}"; $this->_directory->create($resizeDir); $baseURL = str_replace(array('https://', 'http://'), '//', $this->getBaseUrl()); $fileName = str_replace(array('https://', 'http://'), '//', $fileName); $fileName = str_replace($baseURL, '', $fileName); $imageFile = str_replace('revslider/', '', $fileName); $basePath = $this->getBaseDir() . DIRECTORY_SEPARATOR . $fileName; if ($targetPath) { $newPath = $targetPath; } else { $newPath = $this->getBaseDir() . DIRECTORY_SEPARATOR . $resizeDir . DIRECTORY_SEPARATOR . $imageFile; } if ($width != '') { if (file_exists($basePath) && is_file($basePath) && ! file_exists($newPath)) { $imageObj = $this->_imageFactory->create($basePath); $imageObj->constrainOnly(TRUE); $imageObj->keepAspectRatio(TRUE); $imageObj->keepFrame(FALSE); $imageObj->keepTransparency(TRUE); //$imageObj->backgroundColor(array(255,255,255)); $imageObj->resize($width, $height); $res = $imageObj->save($newPath); } $resizedURL = $this->getBaseUrl() . $resizeDir . '/' . $imageFile; } else { $resizedURL = $this->getBaseUrl() . $fileName; } return $resizedURL; } /** * Get image id by url * * @param string $url * @return int */ public function attachment_url_to_postid($url) { return $this->get_image_id_by_url($url); } /** * Get image id by url * * @param string $url * @return int */ public function get_image_id_by_url($url) { $id = false; $imagePath = $this->imageFile($url); if ($imagePath && file_exists($this->imageBaseDir() . DIRECTORY_SEPARATOR . $imagePath)) { $imagePath = $this->_getOriginalImage($imagePath); $id = $this->_galleryImagesHelper->idEncode($imagePath); } return $id; } /** * Get image url by id and size * * @param int Image id * @param string Size type * @return string */ public function wp_get_attachment_image_src($attachment_id, $size='thumbnail') { return $this->image_downsize($attachment_id, $size); } /** * Get attached file * * @param string * @return string */ public function get_attached_file($attachment_id) { if ($attachment_id && strlen($attachment_id) > 11) { $imageFile = $this->imageFile($this->_galleryImagesHelper->idDecode($attachment_id)); $imageFile = $this->_getOriginalImage($imageFile); $image = $this->imageBaseDir() . DIRECTORY_SEPARATOR . $imageFile; if (file_exists($image)) { return $image; } } } /** * Get image info * * @param int $imageId * @return array|boolean */ public function wp_get_attachment_metadata($imageId) { $data = false; if ($image = $this->get_attached_file($imageId)) { // TODO get original image file if already resized one provided $size = getimagesize($image); $width = $size[0]; $height = $size[1]; $sizes = []; foreach (self::$imageSizes as $imageSizeName => $imageSize) { $sizes[$imageSizeName] = [ 'file' => $this->imageFile($image), 'width' => $imageSize['width'], 'height' => $imageSize['height'] ]; } foreach (self::$downsizePercents as $downsizePercent) { $customWidth = round($width * $downsizePercent / 100); $customHeight = round($height * $downsizePercent / 100); $sizes['custom_' . $customWidth . 'x' . $customHeight] = [ 'file' => $this->imageFile($image), 'width' => $customWidth, 'height' => $customHeight ]; } $data = [ 'width' => $width, 'height' => $height, 'file' => $this->imageFile($image), 'sizes' => $sizes, 'image_meta' => [] ]; } return $data; } /** * Resize image by id and preset size * * @param int Image id * @param string Size type * @return string */ public function image_downsize($id, $size = 'medium') { $downsizedImage = false; if ((string)(int)$id === (string)$id && $product = $this->_productFactory->create()->load($id)) { switch ($size) { case 'thumbnail' : $image = $this->_catalogImageHelper ->init($product, 'product_thumbnail_image') ->setImageFile($product->getFile()); $downsizedImage = [ $this->imageClean($image->getUrl()), $image->getWidth(), $image->getHeight() ]; break; case 'small' : $imageUrl = $this->_catalogProductHelper->getSmallImageUrl($product); $downsizedImage = [ $imageUrl, 250, 250 ]; break; case 'medium' : case 'large' : case 'base' : case 'full' : default : $imageUrl = $this->_catalogProductHelper->getImageUrl($product); $downsizedImage = [ $imageUrl, 1000, 1000 ]; break; } } elseif ($id) { if ($image = $this->get_attached_file($id)) { $image = $this->imageFile($image); switch ($size) { case 'base' : case 'full' : if ($imageSize = getimagesize($this->imagePath($image))) { $width = $imageSize[0]; $height = $imageSize[1]; $imageUrl = $this->imageUrl($image); $downsizedImage = array($imageUrl, $width, $height); } break; default : if (strpos($size, 'custom_') === 0) { $customSize = explode('x', str_replace('custom_', '', $size)); $width = $customSize[0]; $height = $customSize[1]; } else { $targetSize = isset(self::$imageSizes[$size]) ? self::$imageSizes[$size] : reset(self::$imageSizes); $width = $targetSize['width']; $height = $targetSize['height']; } $imageUrl = $this->image_resize($this->imageUrl($image), $width, $height); $downsizedImage = array($imageUrl, $width, $height); break; } } } return $downsizedImage; } /** * Resize image * * @param string Image url * @param int Width * @param int Height * @param boolean Is crop * @param boolean Is single * @param boolean Is upscale * @return string */ public function image_resize($url, $width = null, $height = null, $crop = null, $single = true, $upscale = false) { return $this->resizeImg($url, $width, $height); } /** * Resize image to location * * @param string Image url * @param int Width * @param int Height * @param string Target path * @return string */ public function image_resize_to($url, $width = null, $height = null, $targetPath = false) { return $this->resizeImg($this->image_to_url($url), $width, $height, $targetPath); } /** * Alias for Resize Image */ public function rev_aq_resize($url, $width = null, $height = null, $crop = null, $single = true, $upscale = false) { return $this->image_resize($url, $width, $height, $crop, $single, $upscale); } /** * Convert image name to url * * @param string * @return string */ public function image_to_url($image) { $image = $this->imageFile($image); if (empty($image) || strpos($image, '//') !== false) { $url = $image; } else { $url = $this->imageBaseUrl() . $image; } $urlImageData = explode('media/', $url); if (isset($urlImageData['1'])) { $url = $this->getBaseUrl() . ltrim($urlImageData['1'], '/'); } return $url; } /** * Convert image url to path * * @param string * @return string */ public function image_url_to_path($url) { if (strpos($url, $this->imageBaseUrl()) === false && strpos($url, $this->getBaseUrl()) !== false) { $image = str_replace($this->getBaseUrl(), '', $url); $path = $this->getBaseDir() . DIRECTORY_SEPARATOR . $image; } else { $image = str_replace($this->imageBaseUrl(), '', $url); $path = $this->imageBaseDir() . $image; } return $path; } /** * Get image url * * @param string * @return string */ public function imageUrl($image) { if ($image && strpos($image, '//') === false) { $url = $this->imageFile($image); if (strpos($url, self::IMAGE_DIR . '/') === 0) { $url = substr($url, strlen(self::IMAGE_DIR . '/')); } $url = $this->imageBaseUrl() . $url; } else { $url = $this->imageClean($image); } if ($this->_storeManager->getStore()->isCurrentlySecure()) { $url = str_replace('http://', 'https://', $url); } return $url; } /** * Get image path * * @param string * @return string */ public function imagePath($image) { $path = ''; if (strpos($image, $this->imageBaseUrl()) === false && strpos($image, $this->getBaseUrl()) !== false) { $image = str_replace($this->getBaseUrl(), '', $image); if ($image) { $path = $this->getBaseDir() . DIRECTORY_SEPARATOR . str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $image); } } else { $image = str_replace($this->imageBaseUrl(), '', $image); if ($image) { $path = $this->imageBaseDir() . DIRECTORY_SEPARATOR . str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $image); } } return $path; } /** * Get image file from url or path * * @param string * @return string */ public function imageFile($image) { $replace = array( $this->imageBaseDir(), str_replace('http://', 'https://', $this->imageBaseUrl()), str_replace('https://', 'http://', $this->imageBaseUrl()), str_replace('http://', 'https://', $this->getBaseUrl()), str_replace('https://', 'http://', $this->getBaseUrl()), $this->getBaseDir() ); foreach ($replace as $key => $item) { $replace[$key] = rtrim($item, DIRECTORY_SEPARATOR . '/'); } $file = str_replace($replace, '', $this->imageClean($image)); // workaround for image urls from other store if (strpos($file, '://') !== false) { $parts = explode('/media/' . self::IMAGE_DIR, $file); if (isset($parts[1])) { $file = $parts[1]; } } $file = ltrim($file, DIRECTORY_SEPARATOR . '/'); return $file; } /** * Clean image from artifacts * * @param string * @return string */ public function imageClean($image) { $noHttpUrl = false; if (substr($image, 0, 2) == '//') { $noHttpUrl = true; $image = ltrim($image, '/'); } $image = str_replace(array('\\', '//', ':/'), array('/', '/', '://'), $image); // fix for Windows filesystem path like C:/ if (strpos($image, '://') === 1) { $image = str_replace('://', ':/', $image); } if ($noHttpUrl) { $image = '//' . $image; } return $image; } /** * Get media base dir * * @return string */ public function getBaseDir() { return $this->_directory->getAbsolutePath(); } /** * Get images base path * * @return string */ public function imageBaseDir() { return $this->_directory->getAbsolutePath(self::IMAGE_DIR); } /** * Get media base url * * @return string */ public function getBaseUrl() { return $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA); } /** * Get images base url * * @return string */ public function imageBaseUrl() { return $this->getBaseUrl() . self::IMAGE_DIR . '/'; } /** * Check if this is media file * * @param string $file * @return boolean */ public function isMedia($file) { $ext = pathinfo($file, PATHINFO_EXTENSION); return $ext && in_array(strtolower($ext), self::ALLOWED_MEDIA_EXTENSIONS); } /** * Get the original image from the resized one * * @param string $image * @return string */ protected function _getOriginalImage($image) { if (strpos($image, 'thumbs/resized_') == 0) { $image = preg_replace('/thumbs\/resized_\d+x\d+\//m', '', $image); } return $image; } }