You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by mi...@apache.org on 2010/08/16 16:30:05 UTC

svn commit: r985960 - in /incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick: ./ src/main/java/org/apache/clerezza/utils/imagemagick/ src/test/java/org/apache/clerezza/utils/imagemagick/ src/test/resources/org/apa...

Author: mir
Date: Mon Aug 16 14:30:05 2010
New Revision: 985960

URL: http://svn.apache.org/viewvc?rev=985960&view=rev
Log:
CLEREZZA-265: imagemagick provider uses now im4java. The exception no longer occurs.

Added:
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/test/resources/org/apache/clerezza/utils/imagemagick/rocket.jpg   (with props)
Modified:
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/pom.xml
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/main/java/org/apache/clerezza/utils/imagemagick/ImageMagickProvider.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/test/java/org/apache/clerezza/utils/imagemagick/ImageMagickUtilsTest.java

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/pom.xml?rev=985960&r1=985959&r2=985960&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/pom.xml (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/pom.xml Mon Aug 16 14:30:05 2010
@@ -38,5 +38,14 @@
 			<groupId>org.apache.felix</groupId>
 			<artifactId>org.apache.felix.scr.annotations</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.apache.clerezza.ext</groupId>
+			<artifactId>org.im4java</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.im4java</groupId>
+			<artifactId>org.im4java</artifactId>
+			<version>1.1.0</version>
+		</dependency>
 	</dependencies>
-</project>
\ No newline at end of file
+</project>

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/main/java/org/apache/clerezza/utils/imagemagick/ImageMagickProvider.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/main/java/org/apache/clerezza/utils/imagemagick/ImageMagickProvider.java?rev=985960&r1=985959&r2=985960&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/main/java/org/apache/clerezza/utils/imagemagick/ImageMagickProvider.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/main/java/org/apache/clerezza/utils/imagemagick/ImageMagickProvider.java Mon Aug 16 14:30:05 2010
@@ -36,7 +36,6 @@ import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import javax.imageio.ImageIO;
 
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
@@ -55,6 +54,9 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.felix.scr.annotations.Services;
+import org.im4java.core.ConvertCmd;
+import org.im4java.core.IMOperation;
+import org.im4java.core.Stream2BufferedImage;
 
 /**
  * This class implements interfaces that execute system calls to imageMagick.
@@ -73,9 +75,9 @@ import org.apache.felix.scr.annotations.
 	@Property(name="convert", value="convert", description="Specifies the ImageMagick convert command."),
 	@Property(name="identify", value="identify", description="Specifies the ImageMagick identify command."),
 	@Property(name="release_number", intValue=6, description="Specifies ImageMagick release number (Syntax: release.version.majorRevision-minorRevision)."),
-	@Property(name="version_number", intValue=5, description="Specifies ImageMagick version number (Syntax: release.version.majorRevision-minorRevision)."),
-	@Property(name="major_release_number", intValue=2, description="Specifies ImageMagick major revision number (Syntax: release.version.majorRevision-minorRevision)."),
-	@Property(name="minor_release_number", intValue=10, description="Specifies ImageMagick minor revision number (Syntax: release.version.majorRevision-minorRevision)."),
+	@Property(name="version_number", intValue=3, description="Specifies ImageMagick version number (Syntax: release.version.majorRevision-minorRevision)."),
+	@Property(name="major_release_number", intValue=7, description="Specifies ImageMagick major revision number (Syntax: release.version.majorRevision-minorRevision)."),
+	@Property(name="minor_release_number", intValue=9, description="Specifies ImageMagick minor revision number (Syntax: release.version.majorRevision-minorRevision)."),
 	@Property(name="service.ranking", value="100")
 	})
 @Services({
@@ -87,35 +89,13 @@ public class ImageMagickProvider extends
 
 	private String convert = "convert";
 	private String identify = "identify";
-	private int imagemagickRelease = 6;
-	private int imagemagickVersion = 5;
-	private int imagemagickRevisionMajorNumber = 2;
-	private int imagemagickRevisionMinorNumber = 10;
+
 
 	@Reference
 	private Serializer serializer;
 
 	private final Logger logger = LoggerFactory.getLogger(getClass());
 
-	protected void activate(ComponentContext cCtx) {
-		if (cCtx != null) {
-			convert = (String) cCtx.getProperties().get("convert");
-			identify = (String) cCtx.getProperties().get("identify");
-			imagemagickRelease = (Integer) cCtx.getProperties().
-				get("release_number");
-			imagemagickVersion = (Integer) cCtx.getProperties().
-				get("version_number");
-			imagemagickRevisionMajorNumber = (Integer) cCtx.getProperties().
-				get("major_release_number");
-			imagemagickRevisionMinorNumber = (Integer) cCtx.getProperties().
-				get("minor_release_number");
-		}
-		
-		checkImageMagickInstallation();
-		
-		logger.info("ImageMagickProvider activated");
-	}
-
 	/**
 	 * Default Constructor
 	 */
@@ -138,22 +118,17 @@ public class ImageMagickProvider extends
 		try {
 			List<String> command = new ArrayList<String>();
 			command.add(identify);
-			command.add("--version");
+			command.add("-version");
 			Process proc = execCommand(command);
 			
 			BufferedReader br = new BufferedReader(
 					new InputStreamReader(proc.getInputStream()));
 			String output = br.readLine();
 			br.close();
-			
-			ok = checkImageMagickVersion(output, imagemagickRelease, 
-								imagemagickVersion, 
-								imagemagickRevisionMajorNumber, 
-								imagemagickRevisionMinorNumber);
-			
+					
 			command.clear();
 			command.add(convert);
-			command.add("--version");
+			command.add("-version");
 			proc = execCommand(command);
 			
 			br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
@@ -162,8 +137,7 @@ public class ImageMagickProvider extends
 			
 			if(output!=null && !output.contains("Version: ImageMagick")) {
 				ok = false;
-			}
-			
+			}			
 			
 		} catch (InterruptedException ex) {
 			Thread.currentThread().interrupt();
@@ -179,49 +153,10 @@ public class ImageMagickProvider extends
 		}
 		
 		if(!ok) {
-			logger.error("ImageMagick version can not be verified. " +
-			"Please make sure you have ImageMagick (>=" +
-			imagemagickRelease + "." + imagemagickVersion + "." +
-			imagemagickRevisionMajorNumber + "-" + 
-			imagemagickRevisionMinorNumber +
-			") installed correctly");
-			
 			throw new RuntimeException("ImageMagick not installed correctly.");
 		}
 	}
 
-	private boolean checkImageMagickVersion(String str, int release, int version,
-			int revision_major_number, int revision_minor_number) {
-
-		Pattern pattern = Pattern.compile("(\\d+\\.){2}\\d+-\\d+");
-		Matcher matcher = pattern.matcher(str);
-
-		boolean error = false;
-		if (matcher.find()) {
-			String versionString = matcher.group();
-			String[] versionParts = versionString.split("\\.");
-			if (Integer.parseInt(versionParts[0]) < release) {
-				error = true;
-			} else if (Integer.parseInt(versionParts[0]) == release) {
-				if (Integer.parseInt(versionParts[1]) < version) {
-					error = true;
-				} else if (Integer.parseInt(versionParts[1]) == version) {
-					String[] revisionParts = versionParts[2].split("-");
-					if (Integer.parseInt(revisionParts[0]) < revision_major_number) {
-						error = true;
-					} else if (Integer.parseInt(revisionParts[0]) == revision_major_number) {
-						if (Integer.parseInt(revisionParts[1]) < revision_minor_number) {
-							error = true;
-						}
-					}
-				}
-			}
-			return !error;
-		} else {
-			return false;
-		}
-	}
-
 	@Override
 	public BufferedImage makeImageTranslucent(BufferedImage image,
 			float translucency) {
@@ -235,86 +170,76 @@ public class ImageMagickProvider extends
 
 	@Override
 	public BufferedImage flip(BufferedImage image, int direction) {
-		List<String> command = new ArrayList<String>(10);
-		command.add(convert);
+		IMOperation op = new IMOperation();
 		if (direction == 0) {
-			command.add("-flop");
+			op.flop();
 		} else {
-			command.add("-flip");
+			op.flip();
 		}
-
-		return processImage(command, 100, image);
+		return processImage(op, image);
 	}
 
 	@Override
 	public BufferedImage rotate(BufferedImage image, int angle) {
-		List<String> command = new ArrayList<String>(10);
-		command.add(convert);
-		command.add("-rotate");
-		command.add("" + angle);
-
-		return processImage(command, 100, image);
+		IMOperation op = new IMOperation();
+		op.rotate(Double.valueOf(angle));
+		return processImage(op, image);
 	}
 
 	@Override
 	public BufferedImage resize(BufferedImage image, int newWidth, int newHeight) {
-		List<String> command = new ArrayList<String>(10);
-		command.add(convert);
-		command.add("-geometry");
-		command.add(newWidth + "x" + newHeight + "!");
-
-		return processImage(command, 100, image);
+		IMOperation op = new IMOperation();
+		op.resize(newWidth == 0 ? null : newWidth, newHeight == 0 ? null : newHeight, "!");
+		return processImage(op, image);
 	}
 
 	@Override
 	public BufferedImage resizeProportional(BufferedImage image, int newWidth,
 			int newHeight) {
-		List<String> command = new ArrayList<String>(10);
-		command.add(convert);
-		command.add("-geometry");
-		if (newWidth != 0) {
-			command.add("" + newWidth);
-		} else {
-			if (newHeight != 0) {
-				command.add("x" + newHeight);
-			} else {
-				return image;
-			}
-		}
-
-		return processImage(command, 100, image);
+		IMOperation op = new IMOperation();
+		op.resize(newWidth == 0 ? null : newWidth, newWidth !=0 || newHeight == 0  ? null : newHeight);
+		return processImage(op, image);
 	}
 
 	@Override
 	public BufferedImage resizeRelative(BufferedImage image,
 			float resizeFactorWidth, float resizeFactorHeight) {
-		List<String> command = new ArrayList<String>(10);
-		command.add(convert);
-		command.add("-geometry");
-		command.add((100 * resizeFactorWidth) + "%x"
-				+ (100 * resizeFactorHeight) + "%");
-
-		return processImage(command, 100, image);
+		IMOperation op = new IMOperation();
+		Integer newWidth = Float.valueOf(image.getWidth() * resizeFactorWidth).intValue();
+		Integer newHeight = Float.valueOf(image.getHeight() * resizeFactorHeight).intValue();
+		op.resize(newWidth, newHeight, "!");
+		return processImage(op, image);
 	}
 
 	@Override
 	public BufferedImage resizeRelativeProportional(BufferedImage image,
 			float resizeFactor) {
-		List<String> command = new ArrayList<String>(10);
-		command.add(convert);
-		command.add("-geometry");
-		command.add(100 * resizeFactor + "%");
-
-		return processImage(command, 100, image);
+		IMOperation op = new IMOperation();		
+		Integer width = Float.valueOf(image.getWidth() * resizeFactor).intValue();
+		op.resize(width);
+		return processImage(op, image);
 	}
 
-	private BufferedImage crop(BufferedImage image, int newWidth, int newHeight) {
-		List<String> command = new ArrayList<String>(10);
-		command.add(convert);
-		command.add("-crop");
-		command.add(newWidth + "x" + newHeight);
+	@Override
+	public BufferedImage makeAThumbnail(BufferedImage image, int width, int height) {
+		IMOperation op = new IMOperation();
+		op.thumbnail(width, height);
+		return processImage(op, image);
+	}
 
-		return processImage(command, 100, image);
+	private BufferedImage processImage(IMOperation ops, BufferedImage image) {
+		ConvertCmd convertCmd = new ConvertCmd();
+		ops.addImage();
+		ops.addImage("jpg:-");
+		Stream2BufferedImage s2b = new Stream2BufferedImage();
+		convertCmd.setOutputConsumer(s2b);
+		try {
+			convertCmd.run(ops, image);
+		} catch(Exception ex) {
+			throw new RuntimeException(ex);
+		}
+		BufferedImage img = s2b.getImage();
+		return img;
 	}
 
 	@Override
@@ -548,35 +473,6 @@ public class ImageMagickProvider extends
 		return null;
 	}
 
-	
-	
-	private BufferedImage processImage(List<String> command, int quality,
-			BufferedImage image) {
-		command.add("-quality");
-		command.add(String.valueOf(quality));
-		command.add("-");
-		command.add("-");
-		
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		try {
-			if (ImageIO.write(image, "png", baos) == false) {
-				logger.warn("Cannot write image to output stream");
-				return null;
-			}
-
-			return ImageIO.read(execCommand(command, baos.toByteArray()).
-					getInputStream());
-			
-		} catch (InterruptedException ex) {
-			logger.warn("ImageMagick has been interrupted");
-			Thread.currentThread().interrupt();
-			return null;
-		} catch (IOException ex) {
-			logger.warn("IOException while trying to execute {}", command);
-			return null;
-		}
-	}
-
 	private Process execCommand(List<String> command,
 			byte[]... inputData) throws IOException,
 			InterruptedException {

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/test/java/org/apache/clerezza/utils/imagemagick/ImageMagickUtilsTest.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/test/java/org/apache/clerezza/utils/imagemagick/ImageMagickUtilsTest.java?rev=985960&r1=985959&r2=985960&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/test/java/org/apache/clerezza/utils/imagemagick/ImageMagickUtilsTest.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/test/java/org/apache/clerezza/utils/imagemagick/ImageMagickUtilsTest.java Mon Aug 16 14:30:05 2010
@@ -70,6 +70,67 @@ public class ImageMagickUtilsTest {
 		BufferedImage bimg = ip.flip(ImageIO.read(in), 0);
 		assert(bimg != null);
 	}
+
+	@Test
+	public void resizeProportionalTest() throws IOException {
+		Assume.assumeTrue(correctlyInstalled);
+		ImageMagickProvider ip = new ImageMagickProvider();
+		BufferedImage inputImage = ImageIO.read(
+				getClass().getResourceAsStream("rocket.jpg"));
+		BufferedImage outputImage = ip.resizeProportional(inputImage, 200, 200);
+		assert(outputImage != null);
+		Assert.assertEquals(200, outputImage.getWidth());
+		Assert.assertEquals(250, outputImage.getHeight());
+	}
+
+	@Test
+	public void resizeTest() throws IOException {
+		Assume.assumeTrue(correctlyInstalled);
+		ImageMagickProvider ip = new ImageMagickProvider();
+		BufferedImage inputImage = ImageIO.read(
+				getClass().getResourceAsStream("rocket.jpg"));
+		BufferedImage outputImage = ip.resize(inputImage, 200, 200);
+		assert(outputImage != null);
+		Assert.assertEquals(200, outputImage.getHeight());
+		Assert.assertEquals(200, outputImage.getWidth());
+	}
+
+	@Test
+	public void resizeRelativeProportionalTest() throws IOException {
+		Assume.assumeTrue(correctlyInstalled);
+		ImageMagickProvider ip = new ImageMagickProvider();
+		BufferedImage inputImage = ImageIO.read(
+				getClass().getResourceAsStream("rocket.jpg"));
+		BufferedImage outputImage = ip.resizeRelativeProportional(inputImage, Float.valueOf(".5"));
+		assert(outputImage != null);
+		Assert.assertEquals(inputImage.getWidth() / 2, outputImage.getWidth());
+		Assert.assertEquals(inputImage.getHeight() / 2, outputImage.getHeight());
+	}
+	
+	@Test
+	public void resizeRelativeTest() throws IOException {
+		Assume.assumeTrue(correctlyInstalled);
+		ImageMagickProvider ip = new ImageMagickProvider();
+		BufferedImage inputImage = ImageIO.read(
+				getClass().getResourceAsStream("rocket.jpg"));
+		BufferedImage outputImage = ip.resizeRelative(inputImage, Float.valueOf(".5"), 
+				Float.valueOf(".25"));
+		assert(outputImage != null);
+		Assert.assertEquals(inputImage.getHeight() / 4, outputImage.getHeight());
+		Assert.assertEquals(inputImage.getWidth() / 2, outputImage.getWidth());
+	}
+
+	@Test
+	public void thumbnailTest() throws IOException {
+		Assume.assumeTrue(correctlyInstalled);
+		ImageMagickProvider ip = new ImageMagickProvider();
+		BufferedImage inputImage = ImageIO.read(
+				getClass().getResourceAsStream("rocket.jpg"));
+		BufferedImage outputImage = ip.makeAThumbnail(inputImage, 200, 200);
+		Assert.assertEquals(200, outputImage.getHeight());
+		Assert.assertEquals(160, outputImage.getWidth());
+		assert(outputImage != null);
+	}
 	
 	@Test
 	public void extractMetaDataTest() throws IOException {

Added: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/test/resources/org/apache/clerezza/utils/imagemagick/rocket.jpg
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/test/resources/org/apache/clerezza/utils/imagemagick/rocket.jpg?rev=985960&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.utils.imagemagick/src/test/resources/org/apache/clerezza/utils/imagemagick/rocket.jpg
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream