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