use of org.alfresco.repo.content.transform.magick.ImageResizeOptions in project alfresco-repository by Alfresco.
the class TransformationOptionsConverter method getOptions.
public Map<String, String> getOptions(TransformationOptions options, String sourceMimetype, String targetMimetype) {
boolean sourceIsPdf = MIMETYPE_PDF.equals(sourceMimetype);
Map<String, String> map = new HashMap<>();
map.put(TIMEOUT, "-1");
if (options != null) {
if (options instanceof ImageTransformationOptions) {
ImageTransformationOptions opts = (ImageTransformationOptions) options;
// TODO We don't support this any more for security reasons, however it might be possible to
// extract some of the well know values and add them to the newer ImageMagick transform options.
String commandOptions = opts.getCommandOptions();
if (commandOptions != null && !commandOptions.isBlank()) {
logger.error("ImageMagick commandOptions are no longer supported for security reasons: " + commandOptions);
}
ImageResizeOptions imageResizeOptions = opts.getResizeOptions();
if (imageResizeOptions != null) {
int width = imageResizeOptions.getWidth();
int height = imageResizeOptions.getHeight();
ifSet(width != -1, map, RESIZE_WIDTH, width);
ifSet(height != -1, map, RESIZE_HEIGHT, height);
ifSet(imageResizeOptions.isResizeToThumbnail(), map, THUMBNAIL, true);
ifSet(imageResizeOptions.isPercentResize(), map, RESIZE_PERCENTAGE, true);
map.put(ALLOW_ENLARGEMENT, Boolean.toString(imageResizeOptions.getAllowEnlargement()));
map.put(MAINTAIN_ASPECT_RATIO, Boolean.toString(imageResizeOptions.isMaintainAspectRatio()));
}
ifSet(MimetypeMap.MIMETYPE_IMAGE_JPEG.equalsIgnoreCase(targetMimetype), map, ALPHA_REMOVE, true);
map.put(AUTO_ORIENT, Boolean.toString(opts.isAutoOrient()));
Collection<TransformationSourceOptions> sourceOptionsList = opts.getSourceOptionsList();
if (sourceOptionsList != null) {
for (TransformationSourceOptions transformationSourceOptions : sourceOptionsList) {
if (transformationSourceOptions instanceof PagedSourceOptions) {
PagedSourceOptions pagedSourceOptions = (PagedSourceOptions) transformationSourceOptions;
// The legacy transformer options start at page 1, where as image magick and the local
// transforms start at 0;
Integer startPageNumber = pagedSourceOptions.getStartPageNumber() - 1;
Integer endPageNumber = pagedSourceOptions.getEndPageNumber() - 1;
// PAGE is not an imagemagick option, but pdfRederer was incorrectly created initially using these options
if (startPageNumber == endPageNumber && sourceIsPdf) {
map.put(PAGE, Integer.toString(startPageNumber));
} else {
map.put(START_PAGE, Integer.toString(startPageNumber));
map.put(END_PAGE, Integer.toString(endPageNumber));
}
} else if (transformationSourceOptions instanceof CropSourceOptions) {
CropSourceOptions cropSourceOptions = (CropSourceOptions) transformationSourceOptions;
String gravity = cropSourceOptions.getGravity();
boolean percentageCrop = cropSourceOptions.isPercentageCrop();
int height = cropSourceOptions.getHeight();
int width = cropSourceOptions.getWidth();
int xOffset = cropSourceOptions.getXOffset();
int yOffset = cropSourceOptions.getYOffset();
ifSet(gravity != null, map, CROP_GRAVITY, gravity);
ifSet(percentageCrop, map, CROP_PERCENTAGE, percentageCrop);
ifSet(width != -1, map, CROP_WIDTH, width);
ifSet(height != -1, map, CROP_HEIGHT, height);
map.put(CROP_X_OFFSET, Integer.toString(xOffset));
map.put(CROP_Y_OFFSET, Integer.toString(yOffset));
} else if (transformationSourceOptions instanceof TemporalSourceOptions) {
TemporalSourceOptions temporalSourceOptions = (TemporalSourceOptions) transformationSourceOptions;
String duration = temporalSourceOptions.getDuration();
String offset = temporalSourceOptions.getOffset();
ifSet(duration != null, map, DURATION, duration);
ifSet(offset != null, map, OFFSET, offset);
} else {
logger.error("TransformationOption sourceOptionsList contained a " + transformationSourceOptions.getClass().getName() + ". It is not know how to convert this into newer transform options.");
}
}
}
} else if (options instanceof SWFTransformationOptions) {
SWFTransformationOptions opts = (SWFTransformationOptions) options;
map.put(FLASH_VERSION, opts.getFlashVersion());
} else if (options instanceof RuntimeExecutableContentTransformerOptions) {
RuntimeExecutableContentTransformerOptions opts = (RuntimeExecutableContentTransformerOptions) options;
map.putAll(opts.getPropertyValues());
} else if (!options.getClass().equals(TransformationOptions.class)) {
throw new IllegalArgumentException("Unable to convert " + options.getClass().getSimpleName() + " to new transform options held in a Map<String,String>.\n" + "The TransformOptionConverter may need to be sub classed to support this conversion.");
}
}
return map;
}
use of org.alfresco.repo.content.transform.magick.ImageResizeOptions in project alfresco-repository by Alfresco.
the class TransformationOptionsConverter method getTransformationOptions.
/**
* @deprecated as we do not plan to use TransformationOptions moving forwards as local transformations will also
* use the same options as the Transform Service.
*/
@Deprecated
TransformationOptions getTransformationOptions(String renditionName, Map<String, String> options) {
TransformationOptions transformationOptions = null;
Set<String> optionNames = options.keySet();
// The "pdf" rendition is special as it was incorrectly set up as an SWFTransformationOptions in 6.0
// It should have been simply a TransformationOptions.
boolean isPdfRendition = "pdf".equals(renditionName);
Set<String> subclassOptionNames = new HashSet<>(optionNames);
subclassOptionNames.removeAll(LIMIT_OPTIONS);
subclassOptionNames.remove(INCLUDE_CONTENTS);
boolean hasOptions = !subclassOptionNames.isEmpty();
if (isPdfRendition || hasOptions) {
// The "pdf" rendition used the wrong TransformationOptions subclass.
if (isPdfRendition || FLASH_OPTIONS.containsAll(subclassOptionNames)) {
SWFTransformationOptions opts = new SWFTransformationOptions();
transformationOptions = opts;
opts.setFlashVersion(isPdfRendition ? "9" : options.get(FLASH_VERSION));
} else // that use ImageTransformOptions to specify width, height etc.
if (IMAGE_OPTIONS.containsAll(subclassOptionNames) || PDF_OPTIONS.containsAll(subclassOptionNames)) {
ImageTransformationOptions opts = new ImageTransformationOptions();
transformationOptions = opts;
if (containsAny(subclassOptionNames, RESIZE_OPTIONS)) {
ImageResizeOptions imageResizeOptions = new ImageResizeOptions();
opts.setResizeOptions(imageResizeOptions);
// PDF
ifSet(options, WIDTH, (v) -> imageResizeOptions.setWidth(Integer.parseInt(v)));
ifSet(options, HEIGHT, (v) -> imageResizeOptions.setHeight(Integer.parseInt(v)));
// ImageMagick
ifSet(options, RESIZE_WIDTH, (v) -> imageResizeOptions.setWidth(Integer.parseInt(v)));
ifSet(options, RESIZE_HEIGHT, (v) -> imageResizeOptions.setHeight(Integer.parseInt(v)));
ifSet(options, THUMBNAIL, (v) -> imageResizeOptions.setResizeToThumbnail(Boolean.parseBoolean(v)));
ifSet(options, RESIZE_PERCENTAGE, (v) -> imageResizeOptions.setPercentResize(Boolean.parseBoolean(v)));
set(options, ALLOW_ENLARGEMENT, (v) -> imageResizeOptions.setAllowEnlargement(Boolean.parseBoolean(v == null ? "true" : v)));
set(options, MAINTAIN_ASPECT_RATIO, (v) -> imageResizeOptions.setMaintainAspectRatio(Boolean.parseBoolean(v == null ? "true" : v)));
}
// ALPHA_REMOVE can be ignored as it is automatically added in the legacy code if the sourceMimetype is jpeg
set(options, AUTO_ORIENT, (v) -> opts.setAutoOrient(Boolean.parseBoolean(v == null ? "true" : v)));
boolean containsPaged = containsAny(subclassOptionNames, PAGED_OPTIONS);
boolean containsCrop = containsAny(subclassOptionNames, CROP_OPTIONS);
boolean containsTemporal = containsAny(subclassOptionNames, TEMPORAL_OPTIONS);
if (containsPaged || containsCrop || containsTemporal) {
List<TransformationSourceOptions> sourceOptionsList = new ArrayList<>();
if (containsPaged) {
// The legacy transformer options start at page 1, where as image magick and the local
// transforms start at 0;
PagedSourceOptions pagedSourceOptions = new PagedSourceOptions();
sourceOptionsList.add(pagedSourceOptions);
ifSet(options, START_PAGE, (v) -> pagedSourceOptions.setStartPageNumber(Integer.parseInt(v) + 1));
ifSet(options, END_PAGE, (v) -> pagedSourceOptions.setEndPageNumber(Integer.parseInt(v) + 1));
ifSet(options, PAGE, (v) -> {
int i = Integer.parseInt(v) + 1;
pagedSourceOptions.setStartPageNumber(i);
pagedSourceOptions.setEndPageNumber(i);
});
}
if (containsCrop) {
CropSourceOptions cropSourceOptions = new CropSourceOptions();
sourceOptionsList.add(cropSourceOptions);
ifSet(options, CROP_GRAVITY, (v) -> cropSourceOptions.setGravity(v));
ifSet(options, CROP_PERCENTAGE, (v) -> cropSourceOptions.setPercentageCrop(Boolean.parseBoolean(v)));
ifSet(options, CROP_WIDTH, (v) -> cropSourceOptions.setWidth(Integer.parseInt(v)));
ifSet(options, CROP_HEIGHT, (v) -> cropSourceOptions.setHeight(Integer.parseInt(v)));
ifSet(options, CROP_X_OFFSET, (v) -> cropSourceOptions.setXOffset(Integer.parseInt(v)));
ifSet(options, CROP_Y_OFFSET, (v) -> cropSourceOptions.setYOffset(Integer.parseInt(v)));
}
if (containsTemporal) {
TemporalSourceOptions temporalSourceOptions = new TemporalSourceOptions();
sourceOptionsList.add(temporalSourceOptions);
ifSet(options, DURATION, (v) -> temporalSourceOptions.setDuration(v));
ifSet(options, OFFSET, (v) -> temporalSourceOptions.setOffset(v));
}
opts.setSourceOptionsList(sourceOptionsList);
}
}
} else {
// This what the "pdf" rendition should have used in 6.0 and it is not unreasonable for a custom transformer
// and rendition to do the same.
transformationOptions = new TransformationOptions();
}
if (transformationOptions == null) {
StringJoiner sj = new StringJoiner("\n ");
sj.add("The RenditionDefinition2 " + renditionName + " contains options that cannot be mapped to TransformationOptions used by local transformers. " + " The TransformOptionConverter may need to be sub classed to support this conversion.");
HashSet<String> otherNames = new HashSet<>(optionNames);
otherNames.removeAll(FLASH_OPTIONS);
otherNames.removeAll(IMAGE_OPTIONS);
otherNames.removeAll(PDF_OPTIONS);
otherNames.removeAll(LIMIT_OPTIONS);
otherNames.forEach(sj::add);
sj.add("---");
optionNames.forEach(sj::add);
throw new IllegalArgumentException(sj.toString());
}
final TransformationOptions opts = transformationOptions;
ifSet(options, INCLUDE_CONTENTS, (v) -> opts.setIncludeEmbedded(Boolean.parseBoolean(v)));
if (containsAny(optionNames, LIMIT_OPTIONS)) {
TransformationOptionLimits limits = new TransformationOptionLimits();
transformationOptions.setLimits(limits);
ifSet(options, TIMEOUT, (v) -> limits.setTimeoutMs(Long.parseLong(v)));
limits.setMaxSourceSizeKBytes(maxSourceSizeKBytes);
limits.setReadLimitKBytes(readLimitTimeMs);
limits.setReadLimitTimeMs(readLimitKBytes);
limits.setMaxPages(maxPages);
limits.setPageLimit(pageLimit);
}
transformationOptions.setUse(renditionName);
return transformationOptions;
}
use of org.alfresco.repo.content.transform.magick.ImageResizeOptions in project alfresco-repository by Alfresco.
the class TransformationOptionsConverterTest method testResize.
// ImageTransformationOptions [commandOptions=, resizeOptions=ImageResizeOptions [width=20, height=30, maintainAspectRatio=true, percentResize=false,
// resizeToThumbnail=false, allowEnlargement=true], autoOrient=true], sourceOptions={ PagedSourceOptionsPagedSourceOptions {1, 1}} ]
@Test
public void testResize() {
ImageTransformationOptions oldOptions = new ImageTransformationOptions();
ImageResizeOptions imageResizeOptions = new ImageResizeOptions();
imageResizeOptions.setAllowEnlargement(false);
imageResizeOptions.setWidth(20);
imageResizeOptions.setHeight(30);
oldOptions.setResizeOptions(imageResizeOptions);
PagedSourceOptions pagedSourceOptions = new PagedSourceOptions();
pagedSourceOptions.setStartPageNumber(1);
pagedSourceOptions.setEndPageNumber(1);
oldOptions.addSourceOptions(pagedSourceOptions);
assertConverterToMapAndBack(oldOptions, MIMETYPE_IMAGE_JPEG, MIMETYPE_IMAGE_PNG, "ImageTransformationOptions [commandOptions=, " + "resizeOptions=ImageResizeOptions [width=20, height=30, maintainAspectRatio=true, " + "percentResize=false, resizeToThumbnail=false, allowEnlargement=false], autoOrient=true], " + "sourceOptions={ PagedSourceOptionsPagedSourceOptions {1, 1}} ]", "allowEnlargement=false " + "autoOrient=true " + "endPage=0 " + "resizeHeight=30 " + "resizeWidth=20 " + "startPage=0 " + "timeout=-1 ", true);
}
use of org.alfresco.repo.content.transform.magick.ImageResizeOptions in project alfresco-repository by Alfresco.
the class TransformationOptionsConverterTest method testImageTransformationOptionsResize.
@Test
public // Checks we do what was in the legacy ImageMagickContentTransformerWorker
void testImageTransformationOptionsResize() {
ImageTransformationOptions oldOptions = new ImageTransformationOptions();
oldOptions.setAutoOrient(false);
ImageResizeOptions imageResizeOptions = new ImageResizeOptions();
oldOptions.setResizeOptions(imageResizeOptions);
assertConverterToMapAndBack(oldOptions, MIMETYPE_IMAGE_JPEG, MIMETYPE_IMAGE_PNG, "ImageTransformationOptions [commandOptions=, " + "resizeOptions=ImageResizeOptions [width=-1, height=-1, maintainAspectRatio=true, " + "percentResize=false, resizeToThumbnail=false, allowEnlargement=true], autoOrient=false]]", "timeout=-1 ", true);
}
use of org.alfresco.repo.content.transform.magick.ImageResizeOptions in project alfresco-repository by Alfresco.
the class ThumbnailServiceImplTest method testCreateThumbnailFromImage.
@Test
public void testCreateThumbnailFromImage() throws Exception {
checkTransformer();
NodeRef jpgOrig = createOriginalContent(this.folder, MimetypeMap.MIMETYPE_IMAGE_JPEG);
NodeRef gifOrig = createOriginalContent(this.folder, MimetypeMap.MIMETYPE_IMAGE_GIF);
// ===== small: 64x64, marked as thumbnail ====
ImageResizeOptions imageResizeOptions = new ImageResizeOptions();
imageResizeOptions.setWidth(64);
imageResizeOptions.setHeight(64);
imageResizeOptions.setResizeToThumbnail(true);
ImageTransformationOptions imageTransformationOptions = new ImageTransformationOptions();
imageTransformationOptions.setResizeOptions(imageResizeOptions);
// ThumbnailDetails createOptions = new ThumbnailDetails();
NodeRef thumbnail1 = this.thumbnailService.createThumbnail(jpgOrig, ContentModel.PROP_CONTENT, MimetypeMap.MIMETYPE_IMAGE_JPEG, imageTransformationOptions, "small");
assertNotNull(thumbnail1);
checkRenditioned(jpgOrig, Collections.singletonList(new ExpectedAssoc(RegexQNamePattern.MATCH_ALL, "small", 1)));
checkRendition("small", thumbnail1);
outputThumbnailTempContentLocation(thumbnail1, "jpg", "small - 64x64, marked as thumbnail");
// ===== small2: 64x64, aspect not maintained ====
ImageResizeOptions imageResizeOptions2 = new ImageResizeOptions();
imageResizeOptions2.setWidth(64);
imageResizeOptions2.setHeight(64);
imageResizeOptions2.setMaintainAspectRatio(false);
ImageTransformationOptions imageTransformationOptions2 = new ImageTransformationOptions();
imageTransformationOptions2.setResizeOptions(imageResizeOptions2);
// ThumbnailDetails createOptions2 = new ThumbnailDetails();
NodeRef thumbnail2 = this.thumbnailService.createThumbnail(jpgOrig, ContentModel.PROP_CONTENT, MimetypeMap.MIMETYPE_IMAGE_JPEG, imageTransformationOptions2, "small2");
checkRenditioned(jpgOrig, Collections.singletonList(new ExpectedAssoc(RegexQNamePattern.MATCH_ALL, "small2", 1)));
checkRendition("small2", thumbnail2);
outputThumbnailTempContentLocation(thumbnail2, "jpg", "small2 - 64x64, aspect not maintained");
// ===== half: 50%x50 =====
ImageResizeOptions imageResizeOptions3 = new ImageResizeOptions();
imageResizeOptions3.setWidth(50);
imageResizeOptions3.setHeight(50);
imageResizeOptions3.setPercentResize(true);
ImageTransformationOptions imageTransformationOptions3 = new ImageTransformationOptions();
imageTransformationOptions3.setResizeOptions(imageResizeOptions3);
// ThumbnailDetails createOptions3 = new ThumbnailDetails();
NodeRef thumbnail3 = this.thumbnailService.createThumbnail(jpgOrig, ContentModel.PROP_CONTENT, MimetypeMap.MIMETYPE_IMAGE_JPEG, imageTransformationOptions3, "half");
checkRenditioned(jpgOrig, Collections.singletonList(new ExpectedAssoc(RegexQNamePattern.MATCH_ALL, "half", 1)));
checkRendition("half", thumbnail3);
outputThumbnailTempContentLocation(thumbnail3, "jpg", "half - 50%x50%");
// ===== half2: 50%x50 from gif =====
ImageResizeOptions imageResizeOptions4 = new ImageResizeOptions();
imageResizeOptions4.setWidth(50);
imageResizeOptions4.setHeight(50);
imageResizeOptions4.setPercentResize(true);
ImageTransformationOptions imageTransformationOptions4 = new ImageTransformationOptions();
imageTransformationOptions4.setResizeOptions(imageResizeOptions4);
// ThumbnailDetails createOptions4 = new ThumbnailDetails();
NodeRef thumbnail4 = this.thumbnailService.createThumbnail(gifOrig, ContentModel.PROP_CONTENT, MimetypeMap.MIMETYPE_IMAGE_JPEG, imageTransformationOptions4, "half2");
checkRenditioned(gifOrig, Collections.singletonList(new ExpectedAssoc(RegexQNamePattern.MATCH_ALL, "half2", 1)));
checkRendition("half2", thumbnail4);
outputThumbnailTempContentLocation(thumbnail4, "jpg", "half2 - 50%x50%, from gif");
}
Aggregations