Index: lams_common/src/java/org/lamsfoundation/lams/util/imgscalr/ResizePictureUtil.java =================================================================== diff -u -r89d6d5ff79899a6419b2237f06d6547886bddb28 -rcfe1a8cfc78f98f1f0beda760599f08b4fa0b61f --- lams_common/src/java/org/lamsfoundation/lams/util/imgscalr/ResizePictureUtil.java (.../ResizePictureUtil.java) (revision 89d6d5ff79899a6419b2237f06d6547886bddb28) +++ lams_common/src/java/org/lamsfoundation/lams/util/imgscalr/ResizePictureUtil.java (.../ResizePictureUtil.java) (revision cfe1a8cfc78f98f1f0beda760599f08b4fa0b61f) @@ -22,10 +22,12 @@ package org.lamsfoundation.lams.util.imgscalr; +import java.awt.Color; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; +import javax.imageio.IIOException; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; @@ -44,25 +46,33 @@ /** * Reads the original image, creates a resized copy of it and returns its input stream. largestDimension is the - * largest - * dimension of the resized image, the other dimension is scaled accordingly. + * largest dimension of the resized image, the other dimension is scaled accordingly. * * @param is * original image's input stream * @param largestDimension * the largest dimension of the resized image, the other dimension is scaled accordingly * @return - * @throws IOException - * @throws UploadImageGalleryFileException */ - public static InputStream resize(InputStream is, int largestDimension) throws IOException { + public static InputStream resize(InputStream is, int largestDimension) { try { - // load image - BufferedImage image = ImageIO.read(is); - return ResizePictureUtil.resize(image, largestDimension); - + BufferedImage image = ImageIO.read(is); + try { + return ResizePictureUtil.resize(image, largestDimension); + } catch (IIOException e) { + // This may happen when an image is saved with CMYK or other unsupported colour scheme. + // The errors says "Bogus input colorspace". + // One of solutions is to convert the image to RGB, which is done below + if (e.getMessage().contains("colorspace")) { + BufferedImage newBufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), + BufferedImage.TYPE_INT_RGB); + newBufferedImage.createGraphics().drawImage(image, 0, 0, Color.WHITE, null); + return ResizePictureUtil.resize(newBufferedImage, largestDimension); + } + throw e; + } } catch (IOException e) { - log.error(e.getStackTrace()); + log.error("Error while resizing image", e); return null; } } @@ -79,32 +89,27 @@ * @throws IOException * @throws UploadImageGalleryFileException */ - public static InputStream resize(BufferedImage image, int largestDimension) throws IOException { - try { - //resize to 150 pixels max - BufferedImage outImage = Scalr.resize(image, Method.QUALITY, largestDimension); - - //set jpeg compression quality explicitly - ImageWriter imageWriter = ImageIO.getImageWritersByFormatName("jpeg").next(); - ImageWriteParam jpgWriteParam = imageWriter.getDefaultWriteParam(); - jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); - jpgWriteParam.setCompressionQuality(.95f); + private static InputStream resize(BufferedImage image, int largestDimension) throws IOException { - // buffer all data in a circular buffer of infinite sizes - CircularByteBuffer outputBuffer = new CircularByteBuffer(CircularByteBuffer.INFINITE_SIZE); - ImageOutputStream ios = ImageIO.createImageOutputStream(outputBuffer.getOutputStream()); - imageWriter.setOutput(ios); - IIOImage outputImage = new IIOImage(outImage, null, null); - imageWriter.write(null, outputImage, jpgWriteParam); - imageWriter.dispose(); - outputBuffer.getOutputStream().close(); + //resize to 150 pixels max + BufferedImage outImage = Scalr.resize(image, Method.QUALITY, largestDimension); - return outputBuffer.getInputStream(); + //set jpeg compression quality explicitly + ImageWriter imageWriter = ImageIO.getImageWritersByFormatName("jpeg").next(); + ImageWriteParam jpgWriteParam = imageWriter.getDefaultWriteParam(); + jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + jpgWriteParam.setCompressionQuality(.95f); - } catch (IOException e) { - log.error(e); - return null; - } - } + // buffer all data in a circular buffer of infinite sizes + CircularByteBuffer outputBuffer = new CircularByteBuffer(CircularByteBuffer.INFINITE_SIZE); + ImageOutputStream ios = ImageIO.createImageOutputStream(outputBuffer.getOutputStream()); + imageWriter.setOutput(ios); + IIOImage outputImage = new IIOImage(outImage, null, null); + imageWriter.write(null, outputImage, jpgWriteParam); + imageWriter.dispose(); + outputBuffer.getOutputStream().close(); -} + return outputBuffer.getInputStream(); + + } +} \ No newline at end of file Index: lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/service/ImageGalleryServiceImpl.java =================================================================== diff -u -r20aa6cbca9fc96d341080e6ad39f82593443f792 -rcfe1a8cfc78f98f1f0beda760599f08b4fa0b61f --- lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/service/ImageGalleryServiceImpl.java (.../ImageGalleryServiceImpl.java) (revision 20aa6cbca9fc96d341080e6ad39f82593443f792) +++ lams_tool_images/src/java/org/lamsfoundation/lams/tool/imageGallery/service/ImageGalleryServiceImpl.java (.../ImageGalleryServiceImpl.java) (revision cfe1a8cfc78f98f1f0beda760599f08b4fa0b61f) @@ -567,7 +567,12 @@ image.setOriginalImageHeight(originalImage.getHeight(null)); // prepare medium image - InputStream mediumIS = ResizePictureUtil.resize(originalImage, mediumImageDimensions); + originalIS.close(); + originalIS = imageGalleryToolContentHandler.getFileInputStream(nodeKey.getUuid()); + InputStream mediumIS = ResizePictureUtil.resize(originalIS, mediumImageDimensions); + if (mediumIS == null) { + throw new UploadImageGalleryFileException("Impossible to resize image"); + } String mediumFileName = ImageGalleryServiceImpl.MEDIUM_FILENAME_PREFIX + fileName.substring(0, fileName.indexOf('.')) + ".jpg"; NodeKey mediumNodeKey = imageGalleryToolContentHandler.uploadFile(mediumIS, mediumFileName, "image/jpeg"); @@ -638,7 +643,7 @@ public void auditLogStartEditingActivityInMonitor(long toolContentID) { toolService.auditLogStartEditingActivityInMonitor(toolContentID); } - + @Override public boolean isLastActivity(Long toolSessionId) { return toolService.isLastActivity(toolSessionId); @@ -1064,7 +1069,7 @@ public List getConfidenceLevels(Long toolSessionId) { return null; } - + @Override public boolean isUserGroupLeader(Long userId, Long toolSessionId) { return false;