/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.core.commons.services.image.spi;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.MemoryCacheImageInputStream;
import org.apache.commons.io.IOUtils;
import org.olat.core.commons.services.image.ImageHelperSPI;
import org.olat.core.commons.services.image.Size;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.StringHelper;
import org.olat.core.util.vfs.VFSLeaf;
/**
*
* Initial date: 04.04.2014<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public abstract class AbstractImageHelper implements ImageHelperSPI {
private static final OLog log = Tracing.createLoggerFor(AbstractImageHelper.class);
@Override
public Size getSize(VFSLeaf image, String suffix) {
Size size = null;
if(StringHelper.containsNonWhitespace(suffix)) {
size = getImageSize(image, suffix);
}
if(size == null) {
size = getImageSizeFallback(image);
}
return size;
}
public Size getSize(File image, String suffix) {
Size size = null;
if(StringHelper.containsNonWhitespace(suffix)) {
size = getImageSize(image, suffix);
}
if(size == null) {
size = getImageSizeFallback(image);
}
return size;
}
private Size getImageSizeFallback(VFSLeaf media) {
InputStream fileStream = null;
BufferedImage imageSrc = null;
try {
fileStream = media.getInputStream();
if(fileStream != null) {
imageSrc = ImageIO.read(fileStream);
if (imageSrc == null) {
// happens with faulty Java implementation, e.g. on MacOSX
return null;
}
double realWidth = imageSrc.getWidth();
double realHeight = imageSrc.getHeight();
return new Size((int)realWidth, (int)realHeight, 0, 0, false);
} else {
return null;
}
} catch (IOException e) {
// log error, don't do anything else
log.error("Problem while setting image size to fit for resource::" + media, e);
return null;
} finally {
IOUtils.closeQuietly(fileStream);
if (imageSrc != null) {
imageSrc.flush();
}
}
}
private Size getImageSize(VFSLeaf media, String suffix) {
Size result = null;
Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
if (iter.hasNext()) {
ImageInputStream stream = null;
InputStream mediaStream = null;
ImageReader reader = iter.next();
try {
mediaStream = media.getInputStream();
if(mediaStream != null) {
stream = new MemoryCacheImageInputStream(mediaStream);
reader.setInput(stream);
int readerMinIndex = reader.getMinIndex();
int width = reader.getWidth(readerMinIndex);
int height = reader.getHeight(readerMinIndex);
result = new Size(width, height, 0, 0, false);
}
} catch (IOException e) {
log.error(e.getMessage());
} finally {
IOUtils.closeQuietly(stream);
IOUtils.closeQuietly(mediaStream);
reader.dispose();
}
} else {
log.error("No reader found for given format: " + suffix);
}
return result;
}
private Size getImageSize(File media, String suffix) {
Size result = null;
Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
if (iter.hasNext()) {
ImageReader reader = iter.next();
try (InputStream mediaStream = new FileInputStream(media);
ImageInputStream stream = new MemoryCacheImageInputStream(mediaStream)){
reader.setInput(stream);
int readerMinIndex = reader.getMinIndex();
int width = reader.getWidth(readerMinIndex);
int height = reader.getHeight(readerMinIndex);
result = new Size(width, height, 0, 0, false);
} catch (IOException e) {
log.error(e.getMessage());
} finally {
reader.dispose();
}
} else {
log.error("No reader found for given format: " + suffix);
}
return result;
}
private Size getImageSizeFallback(File media) {
BufferedImage imageSrc = null;
try (InputStream fileStream = new FileInputStream(media)) {
imageSrc = ImageIO.read(fileStream);
if (imageSrc == null) {
// happens with faulty Java implementation, e.g. on MacOSX
return null;
}
double realWidth = imageSrc.getWidth();
double realHeight = imageSrc.getHeight();
return new Size((int)realWidth, (int)realHeight, 0, 0, false);
} catch (IOException e) {
// log error, don't do anything else
log.error("Problem while setting image size to fit for resource::" + media, e);
return null;
} finally {
if (imageSrc != null) {
imageSrc.flush();
}
}
}
}