diff --git a/src/main/java/org/olat/core/commons/services/image/ImageHelperBean.java b/src/main/java/org/olat/core/commons/services/image/ImageHelperBean.java index b162ac476f767ca634d6219bd55efa1ba845b011..a06ed45abd3128cac2a80094bebb565f0d8c8443 100644 --- a/src/main/java/org/olat/core/commons/services/image/ImageHelperBean.java +++ b/src/main/java/org/olat/core/commons/services/image/ImageHelperBean.java @@ -49,6 +49,11 @@ public class ImageHelperBean implements ImageService { return imageHelperServiceProvider.getSize(image, suffix); } + @Override + public Size getSize(File image, String suffix) { + return imageHelperServiceProvider.getSize(image, suffix); + } + @Override public boolean cropImage(File image, File cropedImage, Crop cropSelection) { return imageHelperServiceProvider.cropImage(image, cropedImage, cropSelection); diff --git a/src/main/java/org/olat/core/commons/services/image/ImageHelperSPI.java b/src/main/java/org/olat/core/commons/services/image/ImageHelperSPI.java index 720a302870a6c939d9c2b369059980e18b86ce72..05512aa927a318e5d6b6c920e5c4cb348d040a6e 100644 --- a/src/main/java/org/olat/core/commons/services/image/ImageHelperSPI.java +++ b/src/main/java/org/olat/core/commons/services/image/ImageHelperSPI.java @@ -43,6 +43,8 @@ public interface ImageHelperSPI { public Size getSize(VFSLeaf image, String suffix); + public Size getSize(File image, String suffix); + public boolean cropImage(File image, File cropedImage, Crop cropSelection); public Size scaleImage(File image, String extension, File scaledImage, int maxWidth, int maxHeight, boolean fill); diff --git a/src/main/java/org/olat/core/commons/services/image/ImageService.java b/src/main/java/org/olat/core/commons/services/image/ImageService.java index 093bf67a9c5ee9fa09cd2b9eb905b022d194d676..c514f6daeff98d28d0bea07144420d0a52b1468b 100644 --- a/src/main/java/org/olat/core/commons/services/image/ImageService.java +++ b/src/main/java/org/olat/core/commons/services/image/ImageService.java @@ -39,6 +39,8 @@ public interface ImageService { public Size getSize(VFSLeaf image, String suffix); + public Size getSize(File image, String suffix); + public boolean cropImage(File image, File cropedImage, Crop cropSelection); public Size scaleImage(File image, String extension, File scaledImage, int maxWidth, int maxHeight, boolean fill); diff --git a/src/main/java/org/olat/core/commons/services/image/spi/AbstractImageHelper.java b/src/main/java/org/olat/core/commons/services/image/spi/AbstractImageHelper.java index 9ad081e0efef85d1a0bca2e27b476d4d6b5a41d1..9d5a05ff090b4ddc661f6d89a44d2416478464f2 100644 --- a/src/main/java/org/olat/core/commons/services/image/spi/AbstractImageHelper.java +++ b/src/main/java/org/olat/core/commons/services/image/spi/AbstractImageHelper.java @@ -20,6 +20,8 @@ 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; @@ -59,6 +61,17 @@ public abstract class AbstractImageHelper implements ImageHelperSPI { 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; @@ -117,5 +130,51 @@ public abstract class AbstractImageHelper implements ImageHelperSPI { } 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(); + } + } + } } diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties index 053e0b5f9ce17555eedb988e5ebe902c64121b25..9ba756015aab865ac14b3867d79bb732bc887480 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties @@ -1,4 +1,4 @@ -#Thu Jun 02 15:29:28 CEST 2016 +#Wed Jun 15 14:04:13 CEST 2016 add.solution=Add solution add.task=Add task assessment.group.tool=Grade group @@ -214,6 +214,7 @@ solution.list.description=Select "$\:add.solution" or "$\:create.solution" to ad solution.list.title=Upload sample solutions solution.title=Title submission=Submission +submission.add.title=Add document submission.confirmation=The submission of $numberOfFiles file(s) ($filename) for $first $last ($email) at $date, $time has been confirmed. submission.email.confirmation=Send text additionally as email submission.enabled=Enable solution drop box for participants @@ -243,6 +244,7 @@ task.assignment.error=Unexpected error\! task.assignment.type=$org.olat.course.nodes.ta\:form.task.type task.assignment.type.auto=$org.olat.course.nodes.ta\:form.task.type.auto task.assignment.type.manual=$org.olat.course.nodes.ta\:form.task.type.manual +task.coach.allowed.upload=Coaches can upload tasks task.description=Description task.execution=Task execution task.execution.group=as a group diff --git a/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_de.properties index 5ce262e041401dc8b06312133eba5e7db06a0b21..82af75162d63c987e7d74bbe104a0a5cfcd32f67 100644 --- a/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_de.properties @@ -1,4 +1,4 @@ -#Thu Apr 21 15:21:09 CEST 2016 +#Wed Jun 15 14:04:51 CEST 2016 add.track=Untertitel hinzuf\u00FCgen admin.config.enable=Videoressource einschalten admin.config.title=Videokonfiguration @@ -6,24 +6,23 @@ admin.config.transcoding=Transcoding aktivieren admin.config.videoNode=Video Kursbaustein aktivieren admin.menu.title=Video admin.menu.title.alt=Konfiguration der Video-Resource -poster.select=Poster ausw\u00E4hlen -poster.help=Bild vom Typ JPG. Das Bild sollte die identischen Masse wie das Original Video haben (Selbe H\u00F6he und Weite in Pixel). +listing.viewing.counter={0} Aufrufe poster.error.filetype=F\u00FCr Poster Bild werden nur Bilder vom Typ JPG unterst\u00FCtzt. +poster.help=Bild vom Typ JPG. Das Bild sollte die identischen Masse wie das Original Video haben (Selbe H\u00F6he und Weite in Pixel). +poster.select=Poster ausw\u00E4hlen +quality.master=Master video +quality.resolution.1080=1080p Full-HD +quality.resolution.2160=2160p 4K +quality.resolution.240=240p +quality.resolution.360=360p +quality.resolution.480=480p +quality.resolution.720=720p HD quality.table.header.dimension=Dimension quality.table.header.format=Format -quality.table.header.size=Gr\u00F6sse quality.table.header.resolution=Aufl\u00F6sung +quality.table.header.size=Gr\u00F6sse quality.table.header.view=ansehen quality.view=vorschau -quality.master=Master video -quality.resolution.2160=2160p 4K -quality.resolution.1080=1080p Full-HD -quality.resolution.720=720p HD -quality.resolution.480=480p -quality.resolution.360=360p -quality.resolution.240=240p -transcoding.waiting=In Warteschlange -transcoding.processing=In Bearbeitung tab.video.metaDataConfig=Metadaten tab.video.posterConfig=Poster konfigurieren tab.video.qualityConfig=Videoqualit\u00E4ten @@ -41,6 +40,8 @@ track.table.label=Untertitel track.upload=Hochladen track.upload.error.nofile=Bitte w\u00E4hlen Sie eine Datei aus. track.upload.error.nolang=Bitte w\u00E4hlen Sie eine Sprache aus dieser Liste aus +transcoding.processing=In Bearbeitung +transcoding.waiting=In Warteschlange video.config.creationDate=Erstellungs Datum video.config.description=Beschreibung video.config.fileSize=Gr\u00F6sse der Videodatei @@ -51,10 +52,10 @@ video.config.poster.hint=Hier legen Sie fest welches Bild sowohl als Poster / St video.config.poster.replace=Poster ersetzen video.config.poster.upload=Poster hochladen video.config.ratio=Seitenverh\u00E4ltnis +video.config.track.error.type=nur *.vtt and *.srt Dateien sind erlaubt video.config.track.table.file=Untertitel Datei video.config.tracks=Verf\u00FCgbare Untertiteldateien video.config.tracks.table.add=hinzuf\u00FCgen video.config.tracks.table.delete=l\u00F6schen video.config.tracks.table.lang=Sprache video.config.width=Breite -listing.viewing.counter={0} Aufrufe \ No newline at end of file