Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 29 additions & 22 deletions dotCMS/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -294,30 +294,37 @@ dependencies {
compile group: 'eu.bitwalker', name: 'UserAgentUtils', version:'1.19'


compile group: 'com.twelvemonkeys.imageio', name: 'imageio-core', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-metadata', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-bmp', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-jpeg', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-tiff', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-pnm', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-psd', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-iff', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-pcx', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-pict', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-tiff', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-sgi', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-tga', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-icns', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-pcx', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-thumbsdb', version:'3.2.1'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-batik', version:'3.3.2'
compile group: 'com.twelvemonkeys.imageio', name: 'imageio-clippath', version:'3.2.1'
compile group: 'com.twelvemonkeys.servlet', name: 'servlet', version:'3.2.1'
compile 'com.github.ben-manes.caffeine:caffeine:2.4.0'
compile (group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.1'){
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-core', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-metadata', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-bmp', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-jpeg', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-tiff', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-pnm', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-psd', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-iff', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-pcx', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-pdf', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-hdr', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-pict', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-tiff', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-sgi', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-tga', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-icns', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-pcx', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-webp', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-thumbsdb', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-batik', version:'3.7.0'
implementation group: 'com.twelvemonkeys.imageio', name: 'imageio-clippath', version:'3.7.0'
implementation group: 'com.twelvemonkeys.servlet', name: 'servlet', version:'3.7.0'


implementation 'com.github.ben-manes.caffeine:caffeine:2.9.2'

implementation (group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.27'){
exclude(group: 'commons-logging')
}


//Don't remove Bouncy Castle, com.dotcms.staticpublish.listener need it, see plugin's README.
compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.56'
compile group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: '1.56'
Expand Down Expand Up @@ -407,5 +414,5 @@ dependencies {

compile 'net.jodah:failsafe:1.1.1'
compile 'com.rainerhahnekamp:sneakythrow:1.1.0'

}
24 changes: 24 additions & 0 deletions dotCMS/src/main/java/com/dotmarketing/image/ImageEngine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.dotmarketing.image;

import com.dotmarketing.image.filter.ImageFilterAPI;



/**
* Single selection point for the active {@link ImageFilterAPI} implementation.
*
* <p>Returns the libvips engine when the {@code IMAGE_API_USE_LIBVIPS} feature flag is on and native
* libvips is available, otherwise the pure-JVM engine. Every call-site that wants to honour the flag
* — the image exporter, metadata generation, the velocity binary view tool — should resolve through
* here rather than referencing {@link ImageFilterAPI#apiInstance} directly (which is always the
* legacy engine).</p>
*/
public final class ImageEngine {

private ImageEngine() {}


public static ImageFilterAPI resolve() {
return ImageFilterAPI.apiInstance.apply();
}
}
Original file line number Diff line number Diff line change
@@ -1,61 +1,97 @@
package com.dotmarketing.image.filter;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Map;

import java.util.Optional;
import javax.imageio.ImageIO;

import com.dotmarketing.util.Logger;

/**
* Crop a image focusing in a point
*/
public class CropImageFilter extends ImageFilter {

public static final String X_PARAM_KEY = "x";
public static final String Y_PARAM_KEY = "y";
public static final String WIDTH_PARAM_KEY = "w";
public static final String HEIGHT_PARAM_KEY = "h";

public String[] getAcceptedParameters(){
return new String[] {
"x (int) for left of crop",
"y (int) for top of crop",
"w (int) for width of crop",
"h (int) for height of crop"
"h (int) for height of crop",
"fp (int,int) the focal point of the crop"
};
}



public File runFilter(File file, Map<String, String[]> parameters) {
int x = parameters.get(getPrefix() + "x") != null ? Integer.parseInt(parameters.get(getPrefix() + "x")[0]) : 0;
int y = parameters.get(getPrefix() + "y") != null ? Integer.parseInt(parameters.get(getPrefix() + "y")[0]) : 0;
int w = parameters.get(getPrefix() + "w") != null ? Integer.parseInt(parameters.get(getPrefix() + "w")[0]) : 0;
int h = parameters.get(getPrefix() + "h") != null ? Integer.parseInt(parameters.get(getPrefix() + "h")[0]) : 0;
if (w == 0 || h == 0) {
return file;
}

File resultFile = getResultsFile(file, parameters);
public File runFilter(final File file, final Map<String, String[]> parameters) {
int x = parameters.get(getPrefix() + X_PARAM_KEY) != null ? Integer.parseInt(parameters.get(getPrefix() + X_PARAM_KEY)[0]) : 0;
int y = parameters.get(getPrefix() + Y_PARAM_KEY) != null ? Integer.parseInt(parameters.get(getPrefix() + Y_PARAM_KEY)[0]) : 0;
final float widthInput = parameters.get(getPrefix() + WIDTH_PARAM_KEY) != null ? Float.parseFloat(parameters.get(getPrefix() + WIDTH_PARAM_KEY)[0]) : 0f;
final float heightInput = parameters.get(getPrefix() + HEIGHT_PARAM_KEY) != null ? Float.parseFloat(parameters.get(getPrefix() + HEIGHT_PARAM_KEY)[0]) : 0f;
int width = 0;
int height = 0;

final File resultFile = getResultsFile(file, parameters);

if (!overwrite(resultFile, parameters)) {
return resultFile;
}

BufferedImage src;
try {
src = ImageIO.read(file);
if(x > src.getWidth() || y > src.getHeight()){
return file;

}

final BufferedImage src = ImageIO.read(file);
final Dimension current = new Dimension(src.getWidth(), src.getHeight());

if(widthInput ==0 && heightInput >0){
height = Math.round(heightInput <=1 ? current.height * heightInput : heightInput);
width = Math.round(height * current.width / current.height);
}
else if(widthInput >0 && heightInput ==0){
width = Math.round(widthInput <= 1 ? current.width * widthInput : widthInput);
height = Math.round(width * current.height / current.width);
}
else if(widthInput >0 && heightInput >0){
width = Math.round(widthInput <= 1 ? current.width * widthInput : widthInput);
height = Math.round(heightInput <= 1 ? current.height * heightInput : heightInput);
}
else{
width = current.width;
height = current.height;
}

if(x > current.getWidth() || y > current.getHeight()){
return file;
}




if(x + w > src.getWidth()){
w = src.getWidth()-x -1;
if(x + width > current.width){
width = src.getWidth()-x -1;
}
if(y + h > src.getHeight()){
h = src.getHeight()-y-1;
if(y + height > current.height){
height = src.getHeight()-y-1;
}

final BufferedImage out = src.getSubimage(x, y, width, height);

final File tempResultFile = new File(resultFile.getAbsoluteFile() + "_" + System.currentTimeMillis() +".tmp");



BufferedImage out = src.getSubimage(x, y, w, h);
ImageIO.write(out, FILE_EXT, resultFile);

ImageIO.write(out, FILE_EXT, tempResultFile);
out.flush();
tempResultFile.renameTo(resultFile);
} catch (IOException e) {
Logger.error(this.getClass(), e.getMessage());
}
Expand All @@ -64,4 +100,7 @@ public File runFilter(File file, Map<String, String[]> parameters) {
return resultFile;
}




}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public File runFilter(File file, Map<String, String[]> parameters) {

double exp = parameters.get(getPrefix() + "exp") != null ? Double.parseDouble(parameters.get(getPrefix()
+ "exp")[0]) : 0.0;
float f = new Double(exp).floatValue();
float f = Double.valueOf(exp).floatValue();



Expand All @@ -38,8 +38,15 @@ public File runFilter(File file, Map<String, String[]> parameters) {
try {
BufferedImage src = ImageIO.read(file);


final File tempResultFile = new File(resultFile.getAbsoluteFile() + "_" + System.currentTimeMillis() +".tmp.jpg");


BufferedImage dst = ef.filter(src, null);
ImageIO.write(dst, "png", resultFile);
ImageIO.write(dst, "png", tempResultFile);
dst.flush();

tempResultFile.renameTo(resultFile);
} catch (IOException e) {
Logger.error(this.getClass(), e.getMessage());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,15 @@ public File runFilter(File file, Map<String, String[]> parameters) {
if (flip) {
filter.setOperation(FlipFilter.FLIP_H);
}
final File tempResultFile = new File(resultFile.getAbsoluteFile() + "_" + System.currentTimeMillis() +".tmp");


BufferedImage src = ImageIO.read(file);
BufferedImage dst = filter.filter(src, null);
ImageIO.write(dst, "png", resultFile);
ImageIO.write(dst, "png", tempResultFile);
dst.flush();
tempResultFile.renameTo(resultFile);

} catch (IOException e) {
Logger.error(this.getClass(), e.getMessage());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.util.Map;

import javax.imageio.ImageIO;

import com.dotmarketing.exception.DotRuntimeException;
import com.dotmarketing.util.Logger;
import com.dotcms.repackage.com.dotmarketing.jhlabs.image.GammaFilter;

Expand All @@ -18,7 +18,7 @@ public String[] getAcceptedParameters() {
public File runFilter(File file, Map<String, String[]> parameters) {
double g = parameters.get(getPrefix() + "g") != null ? Double.parseDouble(parameters.get(getPrefix() + "g")[0])
: 0.0;
float f = new Double(g).floatValue();
float f = Double.valueOf(g).floatValue();


File resultFile = getResultsFile(file, parameters);
Expand All @@ -36,9 +36,10 @@ public File runFilter(File file, Map<String, String[]> parameters) {

BufferedImage dst = filter.filter(src, null);
ImageIO.write(dst, "png", resultFile);
} catch (IOException e) {
Logger.error(this.getClass(), e.getMessage());
}
dst.flush();
} catch (Exception e) {
throw new DotRuntimeException("unable to convert file:" +file + " : " + e.getMessage(),e);
}

return resultFile;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.imageio.stream.ImageOutputStream;

import com.dotmarketing.exception.DotRuntimeException;
import com.dotmarketing.util.Logger;
import com.dotmarketing.util.UtilMethods;

public class GifImageFilter extends ImageFilter {
public String[] getAcceptedParameters(){
Expand All @@ -27,7 +28,7 @@ public String[] getAcceptedParameters(){
}
public File runFilter(File file, Map<String, String[]> parameters) {

File resultFile = getResultsFile(file, parameters, "gif");
File resultFile = getResultsFile(file, parameters);

if(!overwrite(resultFile,parameters)){
return resultFile;
Expand All @@ -45,15 +46,17 @@ public File runFilter(File file, Map<String, String[]> parameters) {
Graphics2D graphics = dst.createGraphics();

graphics.setPaint ( new Color ( 255, 255, 255 ) );
final File tempResultFile = new File(resultFile.getAbsoluteFile() + "_" + System.currentTimeMillis() +".tmp");

graphics.fillRect(0, 0, src.getWidth(), src.getHeight());
graphics.drawImage(src, 0, 0, src.getWidth(), src.getHeight(),null);
ImageOutputStream ios = ImageIO.createImageOutputStream(resultFile);
ImageOutputStream ios = ImageIO.createImageOutputStream(tempResultFile);
writer.setOutput(ios);
writer.write(null,new IIOImage(dst,null,null),iwp);
ios.flush();
writer.dispose();
ios.close();
tempResultFile.renameTo(resultFile);
//writer.setOutput(output);

// IIOImage image = new IIOImage(src, null, null);
Expand All @@ -74,5 +77,10 @@ public File runFilter(File file, Map<String, String[]> parameters) {
return resultFile;
}

@Override
public File getResultsFile(final File file, final Map<String, String[]> parameters) {
return getResultsFile(file, parameters, "gif");
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.util.Map;

import javax.imageio.ImageIO;

import com.dotmarketing.exception.DotRuntimeException;
import com.dotmarketing.util.Logger;
import com.dotcms.repackage.com.dotmarketing.jhlabs.image.GrayscaleFilter;

Expand All @@ -30,9 +30,10 @@ public File runFilter(File file, Map<String, String[]> parameters) {

BufferedImage dst = filter.filter(src, null);
ImageIO.write(dst, "png", resultFile);
} catch (IOException e) {
Logger.error(this.getClass(), e.getMessage());
}
dst.flush();
} catch (Exception e) {
throw new DotRuntimeException("unable to convert file:" +file + " : " + e.getMessage(),e);
}

return resultFile;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.util.Map;

import javax.imageio.ImageIO;

import com.dotmarketing.exception.DotRuntimeException;
import com.dotmarketing.util.Logger;
import com.dotcms.repackage.com.dotmarketing.jhlabs.image.HSBAdjustFilter;

Expand Down Expand Up @@ -49,9 +49,10 @@ public File runFilter(File file, Map<String, String[]> parameters) {

BufferedImage dst = filter.filter(src, null);
ImageIO.write(dst, "png", resultFile);
} catch (IOException e) {
Logger.error(this.getClass(), e.getMessage());
}
dst.flush();
} catch (Exception e) {
throw new DotRuntimeException("unable to convert file:" +file + " : " + e.getMessage(),e);
}

return resultFile;
}
Expand Down
Loading