6 declare(strict_types=1);
12 use Magento\Catalog\Model\View\Asset\ImageFactory as AssertImageFactory;
21 use \Magento\Catalog\Model\ResourceModel\Product\Image as ProductImage;
44 private $productImage;
49 private $imageFactory;
54 private $paramsBuilder;
64 private $assertImageFactory;
69 private $themeCustomizationConfig;
74 private $themeCollection;
79 private $mediaDirectory;
102 MediaConfig $imageConfig,
103 ProductImage $productImage,
104 ImageFactory $imageFactory,
106 ViewConfig $viewConfig,
107 AssertImageFactory $assertImageFactory,
108 ThemeCustomizationConfig $themeCustomizationConfig,
112 $this->appState = $appState;
113 $this->imageConfig = $imageConfig;
114 $this->productImage = $productImage;
115 $this->imageFactory = $imageFactory;
116 $this->paramsBuilder = $paramsBuilder;
117 $this->viewConfig = $viewConfig;
118 $this->assertImageFactory = $assertImageFactory;
119 $this->themeCustomizationConfig = $themeCustomizationConfig;
120 $this->themeCollection = $themeCollection;
132 $originalImagePath = $this->mediaDirectory->getAbsolutePath(
133 $this->imageConfig->getMediaPath($originalImageName)
135 if (!$this->mediaDirectory->isFile($originalImagePath)) {
136 throw new NotFoundException(
__(
'Cannot resize image "%1" - original image not found', $originalImagePath));
138 foreach ($this->getViewImages($this->getThemesInUse()) as $viewImage) {
139 $this->resize($viewImage, $originalImagePath, $originalImageName);
151 $count = $this->productImage->getCountAllProductImages();
156 $productImages = $this->productImage->getAllProductImages();
157 $viewImages = $this->getViewImages($themes ?? $this->getThemesInUse());
159 foreach ($productImages as
$image) {
160 $originalImageName =
$image[
'filepath'];
161 $originalImagePath = $this->mediaDirectory->getAbsolutePath(
162 $this->imageConfig->getMediaPath($originalImageName)
164 foreach ($viewImages as $viewImage) {
165 $this->resize($viewImage, $originalImagePath, $originalImageName);
167 yield $originalImageName =>
$count;
175 private function getThemesInUse(): array
178 $registeredThemes = $this->themeCollection->loadRegisteredThemes();
179 $storesByThemes = $this->themeCustomizationConfig->getStoresByThemes();
180 $keyType = is_integer(key($storesByThemes)) ?
'getId' :
'getCode';
181 foreach ($registeredThemes as $registeredTheme) {
182 if (array_key_exists($registeredTheme->$keyType(), $storesByThemes)) {
183 $themesInUse[] = $registeredTheme;
194 private function getViewImages(array $themes): array
198 foreach ($themes as
$theme) {
199 $config = $this->viewConfig->getViewConfig([
203 $images =
$config->getMediaEntities(
'Magento_Catalog', ImageHelper::MEDIA_TYPE_CONFIG_NODE);
204 foreach ($images as $imageId => $imageData) {
205 $uniqIndex = $this->getUniqueImageIndex($imageData);
206 $imageData[
'id'] = $imageId;
207 $viewImages[$uniqIndex] = $imageData;
218 private function getUniqueImageIndex(array $imageData): string
221 unset($imageData[
'type']);
222 return md5(json_encode($imageData));
231 private function makeImage(
string $originalImagePath, array $imageParams): Image
233 $image = $this->imageFactory->create($originalImagePath);
234 $image->keepAspectRatio($imageParams[
'keep_aspect_ratio']);
235 $image->keepFrame($imageParams[
'keep_frame']);
236 $image->keepTransparency($imageParams[
'keep_transparency']);
237 $image->constrainOnly($imageParams[
'constrain_only']);
238 $image->backgroundColor($imageParams[
'background']);
239 $image->quality($imageParams[
'quality']);
249 private function resize(array $viewImage,
string $originalImagePath,
string $originalImageName)
251 $imageParams = $this->paramsBuilder->build($viewImage);
252 $image = $this->makeImage($originalImagePath, $imageParams);
253 $imageAsset = $this->assertImageFactory->create(
255 'miscParams' => $imageParams,
256 'filePath' => $originalImageName,
260 if ($imageParams[
'image_width'] !==
null && $imageParams[
'image_height'] !==
null) {
261 $image->resize($imageParams[
'image_width'], $imageParams[
'image_height']);
263 $image->save($imageAsset->getPath());