1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.onehippo.forge.gallerymagick.core.command;
17
18 import java.io.ByteArrayOutputStream;
19 import java.io.File;
20 import java.io.IOException;
21 import java.util.Arrays;
22 import java.util.Collections;
23 import java.util.List;
24
25 import org.apache.commons.lang.StringUtils;
26 import org.onehippo.forge.gallerymagick.core.ImageDimension;
27
28
29
30
31 public class ImageMagickCommandUtils {
32
33 private ImageMagickCommandUtils() {
34 }
35
36
37
38
39
40
41
42
43 public static String identifyAllMetadata(File sourceFile) throws MagickExecuteException, IOException {
44 ImageMagickCommand cmd = new ImageMagickCommand(null, "identify");
45
46 final File tempFolder = getTempFolder();
47
48 if (tempFolder != null) {
49 cmd.setWorkingDirectory(tempFolder);
50 }
51
52 cmd.addArgument("-verbose");
53 cmd.addArgument(sourceFile.getCanonicalPath());
54
55 ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
56 cmd.execute(baos);
57 return StringUtils.trim(baos.toString("UTF-8"));
58 }
59
60
61
62
63
64
65
66
67 public static ImageDimension identifyDimension(File sourceFile) throws MagickExecuteException, IOException {
68 ImageMagickCommand cmd = new ImageMagickCommand(null, "identify");
69
70 final File tempFolder = getTempFolder();
71
72 if (tempFolder != null) {
73 cmd.setWorkingDirectory(tempFolder);
74 }
75
76 cmd.addArgument("-format");
77 cmd.addArgument("%wx%h");
78 cmd.addArgument(sourceFile.getCanonicalPath());
79
80 ByteArrayOutputStream baos = new ByteArrayOutputStream(40);
81 cmd.execute(baos);
82 String output = StringUtils.trim(baos.toString("UTF-8"));
83
84 return ImageDimension.from(output);
85 }
86
87
88
89
90
91
92
93
94
95
96 public static void resizeImage(File sourceFile, File targetFile, ImageDimension dimension)
97 throws MagickExecuteException, IOException {
98 resizeImage(sourceFile, targetFile, dimension, (String []) null);
99 }
100
101
102
103
104
105
106
107
108
109
110
111 public static void resizeImage(File sourceFile, File targetFile, ImageDimension dimension, String ... extraOptions)
112 throws MagickExecuteException, IOException {
113 if (dimension == null) {
114 throw new IllegalArgumentException("Invalid dimension: " + dimension);
115 }
116
117 ImageMagickCommand cmd = new ImageMagickCommand(null, "convert");
118
119 final File tempFolder = getTempFolder();
120
121 if (tempFolder != null) {
122 cmd.setWorkingDirectory(tempFolder);
123 }
124
125 cmd.addArgument(sourceFile.getCanonicalPath());
126 final String dimensionArg = dimension.toCommandArgument();
127 cmd.addArgument("-resize");
128 cmd.addArgument(dimensionArg);
129
130 final List<String> extraOptionList = (extraOptions != null) ? Arrays.asList(extraOptions) : Collections.emptyList();
131
132 for (String extraOption : extraOptionList) {
133 cmd.addArgument(extraOption);
134 }
135
136 if (dimension.getWidth() > 0 || dimension.getHeight() > 0) {
137 if (!extraOptionList.contains("-size")) {
138 cmd.addArgument("-size");
139 cmd.addArgument(dimensionArg);
140 }
141 }
142
143 if (!extraOptionList.contains("+profile") && !extraOptionList.contains("-profile")) {
144 cmd.addArgument("+profile");
145 cmd.addArgument("*");
146 }
147
148 cmd.addArgument(targetFile.getCanonicalPath());
149
150 cmd.execute();
151 }
152
153
154
155
156
157 private static File getTempFolder() {
158 File tempFolder = null;
159 final String tmpDirPath = System.getProperty("java.io.tmpdir");
160
161 if (StringUtils.isNotBlank(tmpDirPath)) {
162 tempFolder = new File(tmpDirPath);
163 }
164
165 return tempFolder;
166 }
167 }