All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.adaptive.media.image.internal.scaler.AMImageMagickImageScaler Maven / Gradle / Ivy

/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.adaptive.media.image.internal.scaler;

import com.liferay.adaptive.media.exception.AMRuntimeException;
import com.liferay.adaptive.media.image.configuration.AMImageConfigurationEntry;
import com.liferay.adaptive.media.image.scaler.AMImageScaledImage;
import com.liferay.adaptive.media.image.scaler.AMImageScaler;
import com.liferay.petra.string.StringBundler;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.image.ImageBag;
import com.liferay.portal.kernel.image.ImageMagickUtil;
import com.liferay.portal.kernel.image.ImageTool;
import com.liferay.portal.kernel.image.ImageToolUtil;
import com.liferay.portal.kernel.repository.model.FileVersion;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.GetterUtil;

import java.awt.image.RenderedImage;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;

import org.osgi.service.component.annotations.Component;

/**
 * @author Eric Yan
 */
@Component(service = AMImageScaler.class)
public class AMImageMagickImageScaler implements AMImageScaler {

	@Override
	public boolean isEnabled() {
		if (ImageMagickUtil.isEnabled()) {
			return true;
		}

		return false;
	}

	@Override
	public AMImageScaledImage scaleImage(
		FileVersion fileVersion,
		AMImageConfigurationEntry amImageConfigurationEntry) {

		File imageFile = null;
		File scaledImageFile = null;

		try {
			imageFile = _getFile(fileVersion);

			scaledImageFile = _scaleAndConvertToPNG(
				amImageConfigurationEntry, imageFile);

			if (!scaledImageFile.exists()) {
				throw new AMRuntimeException.IOException(
					"Unable to scale image using ImageMagick");
			}

			ImageBag imageBag = ImageToolUtil.read(scaledImageFile);

			RenderedImage renderedImage = imageBag.getRenderedImage();

			return new AMImageScaledImageImpl(
				ImageToolUtil.getBytes(renderedImage, imageBag.getType()),
				renderedImage.getHeight(), ContentTypes.IMAGE_PNG,
				renderedImage.getWidth());
		}
		catch (Exception exception) {
			throw new AMRuntimeException.IOException(
				StringBundler.concat(
					"Unable to scale file entry ", fileVersion.getFileEntryId(),
					" to match adaptive media configuration ",
					amImageConfigurationEntry.getUUID()),
				exception);
		}
		finally {
			if (imageFile != null) {
				imageFile.delete();
			}

			if (scaledImageFile != null) {
				scaledImageFile.delete();
			}
		}
	}

	private File _getFile(FileVersion fileVersion)
		throws IOException, PortalException {

		try (InputStream inputStream = fileVersion.getContentStream(false)) {
			return FileUtil.createTempFile(inputStream);
		}
	}

	private String _getResizeArg(
		AMImageConfigurationEntry amImageConfigurationEntry) {

		Map properties =
			amImageConfigurationEntry.getProperties();

		int maxHeight = GetterUtil.getInteger(properties.get("max-height"));
		int maxWidth = GetterUtil.getInteger(properties.get("max-width"));

		if ((maxHeight > 0) && (maxWidth > 0)) {
			return StringBundler.concat(maxWidth, "x", maxHeight, ">");
		}

		return null;
	}

	private File _scaleAndConvertToPNG(
			AMImageConfigurationEntry amImageConfigurationEntry, File imageFile)
		throws Exception {

		File scaledImageFile = FileUtil.createTempFile(ImageTool.TYPE_PNG);

		List arguments = new ArrayList<>();

		arguments.add(imageFile.getAbsolutePath());

		String resizeArg = _getResizeArg(amImageConfigurationEntry);

		if (resizeArg != null) {
			arguments.add("-resize");
			arguments.add(resizeArg);
		}

		arguments.add(scaledImageFile.getAbsolutePath());

		Future future = ImageMagickUtil.convert(arguments);

		future.get();

		return scaledImageFile;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy