task interface and java helper
12
.classpath
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src/java"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="owner.project.facets" value="java"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="lib" path="C:/Program Files (x86)/BaseX/BaseX.jar" sourcepath="/basex-core/src"/>
|
||||||
|
<classpathentry kind="lib" path="src/main/content/thumbnailator-0.4.8.jar"/>
|
||||||
|
<classpathentry kind="output" path="build/classes"/>
|
||||||
|
</classpath>
|
||||||
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/build/
|
||||||
18
.project
|
|
@ -5,7 +5,25 @@
|
||||||
<projects>
|
<projects>
|
||||||
</projects>
|
</projects>
|
||||||
<buildSpec>
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.wst.common.project.facet.core.builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
</buildSpec>
|
</buildSpec>
|
||||||
<natures>
|
<natures>
|
||||||
|
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|
|
||||||
12
.settings/org.eclipse.jdt.core.prefs
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.7
|
||||||
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.7
|
||||||
4
.settings/org.eclipse.wst.common.project.facet.core.xml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<faceted-project>
|
||||||
|
<installed facet="java" version="1.7"/>
|
||||||
|
</faceted-project>
|
||||||
10
catalog.xml
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD XML Catalogs V1.1//EN" "http://www.oasis-open.org/committees/entity/release/1.1/catalog.dtd">
|
||||||
|
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
|
||||||
|
|
||||||
|
<!-- catalog entry for all notes -->
|
||||||
|
<rewriteURI
|
||||||
|
uriStartString="expkg-zone58:image.thumbnailator/schema/"
|
||||||
|
rewritePrefix="./src/content/"/>
|
||||||
|
|
||||||
|
</catalog>
|
||||||
108
dist/doc/thumbnailator.xqm.xml
vendored
|
|
@ -1,37 +1,36 @@
|
||||||
<xqdoc:xqdoc xmlns:xqdoc="http://www.xqdoc.org/1.0">
|
<xqdoc:xqdoc xmlns:xqdoc="http://www.xqdoc.org/1.0">
|
||||||
<xqdoc:control>
|
<xqdoc:control>
|
||||||
<xqdoc:date>2016-04-16T22:19:53.356+01:00</xqdoc:date>
|
<xqdoc:date>2017-04-21T14:41:43.648+01:00</xqdoc:date>
|
||||||
<xqdoc:version>1.1</xqdoc:version>
|
<xqdoc:version>1.1</xqdoc:version>
|
||||||
</xqdoc:control>
|
</xqdoc:control>
|
||||||
<xqdoc:module type="library">
|
<xqdoc:module type="library">
|
||||||
<xqdoc:uri>expkg-zone58.image.thumbnailator</xqdoc:uri>
|
<xqdoc:uri>expkg-zone58:image.thumbnailator</xqdoc:uri>
|
||||||
<xqdoc:name>thumbnailator.xqm</xqdoc:name>
|
<xqdoc:name>thumbnailator.xqm</xqdoc:name>
|
||||||
<xqdoc:comment>
|
<xqdoc:comment>
|
||||||
<xqdoc:description>Generate thumbnails using http://code.google.com/p/thumbnailator/</xqdoc:description>
|
<xqdoc:description>Generate image thumbnails using the thumbnailator library.</xqdoc:description>
|
||||||
|
<xqdoc:see>https://github.com/coobird/thumbnailator</xqdoc:see>
|
||||||
<xqdoc:author>andy bunce</xqdoc:author>
|
<xqdoc:author>andy bunce</xqdoc:author>
|
||||||
|
<xqdoc:version>4.4.1</xqdoc:version>
|
||||||
</xqdoc:comment>
|
</xqdoc:comment>
|
||||||
</xqdoc:module>
|
</xqdoc:module>
|
||||||
<xqdoc:namespaces>
|
<xqdoc:namespaces>
|
||||||
<xqdoc:namespace prefix="thumbnails" uri="expkg-zone58.image.thumbnailator"/>
|
<xqdoc:namespace prefix="thumbnails" uri="expkg-zone58:image.thumbnailator"/>
|
||||||
<xqdoc:namespace prefix="File" uri="java:java.io.File"/>
|
|
||||||
<xqdoc:namespace prefix="Thumbnailator" uri="java:net.coobird.thumbnailator.Thumbnailator"/>
|
|
||||||
<xqdoc:namespace prefix="BufferedImageBuilder" uri="java:net.coobird.thumbnailator.builders.BufferedImageBuilder"/>
|
|
||||||
<xqdoc:namespace prefix="Builder" uri="java:net.coobird.thumbnailator.Thumbnails$Builder"/>
|
|
||||||
</xqdoc:namespaces>
|
</xqdoc:namespaces>
|
||||||
<xqdoc:imports/>
|
<xqdoc:imports/>
|
||||||
<xqdoc:variables/>
|
<xqdoc:variables/>
|
||||||
<xqdoc:functions>
|
<xqdoc:functions>
|
||||||
<xqdoc:function arity="4">
|
<xqdoc:function arity="3">
|
||||||
<xqdoc:name>sourceRegion</xqdoc:name>
|
<xqdoc:comment>
|
||||||
<xqdoc:signature>declare function sourceRegion($x as xs:integer, $y as xs:integer, $width as xs:integer, $height as xs:integer) as item()*</xqdoc:signature>
|
<xqdoc:description>generate scaled version of source image with maximum dimension of size</xqdoc:description>
|
||||||
|
<xqdoc:param>$source base64Binary (streamed?) e.g from `fetch:binary`</xqdoc:param>
|
||||||
|
<xqdoc:custom tag="result">base64Binary for thumbnail</xqdoc:custom>
|
||||||
|
</xqdoc:comment>
|
||||||
|
<xqdoc:name>thumbnails:size</xqdoc:name>
|
||||||
|
<xqdoc:signature>declare function thumbnails:size($source as xs:base64Binary, $width as xs:integer, $height as xs:integer) as xs:base64Binary</xqdoc:signature>
|
||||||
<xqdoc:parameters>
|
<xqdoc:parameters>
|
||||||
<xqdoc:parameter>
|
<xqdoc:parameter>
|
||||||
<xqdoc:name>x</xqdoc:name>
|
<xqdoc:name>source</xqdoc:name>
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
<xqdoc:type>xs:base64Binary</xqdoc:type>
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>y</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
</xqdoc:parameter>
|
||||||
<xqdoc:parameter>
|
<xqdoc:parameter>
|
||||||
<xqdoc:name>width</xqdoc:name>
|
<xqdoc:name>width</xqdoc:name>
|
||||||
|
|
@ -43,53 +42,74 @@
|
||||||
</xqdoc:parameter>
|
</xqdoc:parameter>
|
||||||
</xqdoc:parameters>
|
</xqdoc:parameters>
|
||||||
<xqdoc:return>
|
<xqdoc:return>
|
||||||
<xqdoc:type occurrence="*">item()</xqdoc:type>
|
<xqdoc:type>xs:base64Binary</xqdoc:type>
|
||||||
</xqdoc:return>
|
</xqdoc:return>
|
||||||
</xqdoc:function>
|
</xqdoc:function>
|
||||||
<xqdoc:function arity="3">
|
<xqdoc:function arity="3">
|
||||||
<xqdoc:name>size</xqdoc:name>
|
<xqdoc:comment>
|
||||||
<xqdoc:signature>declare function size($builder as item()*, $width as xs:int, $height as xs:int) as item()*</xqdoc:signature>
|
<xqdoc:description>generate scaled version of source image at given factors 0-1</xqdoc:description>
|
||||||
|
<xqdoc:param>$source base64Binary (streamed?) e.g from `fetch:binary`</xqdoc:param>
|
||||||
|
<xqdoc:custom tag="result">base64Binary for thumbnail</xqdoc:custom>
|
||||||
|
</xqdoc:comment>
|
||||||
|
<xqdoc:name>thumbnails:scale</xqdoc:name>
|
||||||
|
<xqdoc:signature>declare function thumbnails:scale($source as xs:base64Binary, $xscale as xs:float, $yscale as xs:float) as xs:base64Binary</xqdoc:signature>
|
||||||
<xqdoc:parameters>
|
<xqdoc:parameters>
|
||||||
<xqdoc:parameter>
|
<xqdoc:parameter>
|
||||||
<xqdoc:name>builder</xqdoc:name>
|
<xqdoc:name>source</xqdoc:name>
|
||||||
<xqdoc:type occurrence="*">item()</xqdoc:type>
|
<xqdoc:type>xs:base64Binary</xqdoc:type>
|
||||||
</xqdoc:parameter>
|
</xqdoc:parameter>
|
||||||
<xqdoc:parameter>
|
<xqdoc:parameter>
|
||||||
<xqdoc:name>width</xqdoc:name>
|
<xqdoc:name>xscale</xqdoc:name>
|
||||||
<xqdoc:type>xs:int</xqdoc:type>
|
<xqdoc:type>xs:float</xqdoc:type>
|
||||||
</xqdoc:parameter>
|
</xqdoc:parameter>
|
||||||
<xqdoc:parameter>
|
<xqdoc:parameter>
|
||||||
<xqdoc:name>height</xqdoc:name>
|
<xqdoc:name>yscale</xqdoc:name>
|
||||||
<xqdoc:type>xs:int</xqdoc:type>
|
<xqdoc:type>xs:float</xqdoc:type>
|
||||||
</xqdoc:parameter>
|
</xqdoc:parameter>
|
||||||
</xqdoc:parameters>
|
</xqdoc:parameters>
|
||||||
<xqdoc:return>
|
<xqdoc:return>
|
||||||
<xqdoc:type occurrence="*">item()</xqdoc:type>
|
<xqdoc:type>xs:base64Binary</xqdoc:type>
|
||||||
</xqdoc:return>
|
</xqdoc:return>
|
||||||
</xqdoc:function>
|
</xqdoc:function>
|
||||||
<xqdoc:function arity="4">
|
<xqdoc:function arity="2">
|
||||||
<xqdoc:name>create-thumbnail</xqdoc:name>
|
<xqdoc:comment>
|
||||||
<xqdoc:signature>declare function create-thumbnail($src as xs:string, $dest as xs:string, $width as xs:integer, $height as xs:integer) as item()*</xqdoc:signature>
|
<xqdoc:description>generate thumbnail using parameters specified via XML</xqdoc:description>
|
||||||
|
<xqdoc:param>$source base64Binary (streamed?) e.g from `fetch:binary`</xqdoc:param>
|
||||||
|
<xqdoc:param>$task XML parameters <task><size width="100" ..</xqdoc:param>
|
||||||
|
<xqdoc:custom tag="result">base64Binary for thumbnail</xqdoc:custom>
|
||||||
|
</xqdoc:comment>
|
||||||
|
<xqdoc:name>thumbnails:task</xqdoc:name>
|
||||||
|
<xqdoc:signature>declare function thumbnails:task($source as xs:base64Binary, $task as element(task)) as xs:base64Binary</xqdoc:signature>
|
||||||
|
<xqdoc:parameters>
|
||||||
|
<xqdoc:parameter>
|
||||||
|
<xqdoc:name>source</xqdoc:name>
|
||||||
|
<xqdoc:type>xs:base64Binary</xqdoc:type>
|
||||||
|
</xqdoc:parameter>
|
||||||
|
<xqdoc:parameter>
|
||||||
|
<xqdoc:name>task</xqdoc:name>
|
||||||
|
<xqdoc:type>element(task)</xqdoc:type>
|
||||||
|
</xqdoc:parameter>
|
||||||
|
</xqdoc:parameters>
|
||||||
|
<xqdoc:return>
|
||||||
|
<xqdoc:type>xs:base64Binary</xqdoc:type>
|
||||||
|
</xqdoc:return>
|
||||||
|
</xqdoc:function>
|
||||||
|
<xqdoc:function arity="1">
|
||||||
|
<xqdoc:comment>
|
||||||
|
<xqdoc:description>validate task XML against schema</xqdoc:description>
|
||||||
|
<xqdoc:param>$src XML parameters <task><size width="100" ..</xqdoc:param>
|
||||||
|
<xqdoc:custom tag="result">validation report</xqdoc:custom>
|
||||||
|
</xqdoc:comment>
|
||||||
|
<xqdoc:name>thumbnails:validation-report</xqdoc:name>
|
||||||
|
<xqdoc:signature>declare function thumbnails:validation-report($src as item()*) as element(report)</xqdoc:signature>
|
||||||
<xqdoc:parameters>
|
<xqdoc:parameters>
|
||||||
<xqdoc:parameter>
|
<xqdoc:parameter>
|
||||||
<xqdoc:name>src</xqdoc:name>
|
<xqdoc:name>src</xqdoc:name>
|
||||||
<xqdoc:type>xs:string</xqdoc:type>
|
<xqdoc:type occurrence="*">item()</xqdoc:type>
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>dest</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:string</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>width</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>height</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
</xqdoc:parameter>
|
||||||
</xqdoc:parameters>
|
</xqdoc:parameters>
|
||||||
<xqdoc:return>
|
<xqdoc:return>
|
||||||
<xqdoc:type occurrence="*">item()</xqdoc:type>
|
<xqdoc:type>element(report)</xqdoc:type>
|
||||||
</xqdoc:return>
|
</xqdoc:return>
|
||||||
</xqdoc:function>
|
</xqdoc:function>
|
||||||
</xqdoc:functions>
|
</xqdoc:functions>
|
||||||
|
|
|
||||||
108
dist/xqdoc.xml
vendored
|
|
@ -1,108 +0,0 @@
|
||||||
<xqdoc:xqdoc xmlns:xqdoc="http://www.xqdoc.org/1.0">
|
|
||||||
<xqdoc:control>
|
|
||||||
<xqdoc:date>2013-08-04T23:31:57.796+01:00</xqdoc:date>
|
|
||||||
<xqdoc:version>1.1</xqdoc:version>
|
|
||||||
</xqdoc:control>
|
|
||||||
<xqdoc:module type="library">
|
|
||||||
<xqdoc:uri>apb.image.thumbnailator</xqdoc:uri>
|
|
||||||
<xqdoc:name>thumbnailator.xqm</xqdoc:name>
|
|
||||||
<xqdoc:comment>
|
|
||||||
<xqdoc:description>Generate thumbnails using http://code.google.com/p/thumbnailator/</xqdoc:description>
|
|
||||||
<xqdoc:author>andy bunce</xqdoc:author>
|
|
||||||
</xqdoc:comment>
|
|
||||||
</xqdoc:module>
|
|
||||||
<xqdoc:namespaces>
|
|
||||||
<xqdoc:namespace prefix="thumbnails" uri="apb.image.thumbnailator"/>
|
|
||||||
<xqdoc:namespace prefix="File" uri="java:java.io.File"/>
|
|
||||||
<xqdoc:namespace prefix="Thumbnailator" uri="java:net.coobird.thumbnailator.Thumbnailator"/>
|
|
||||||
<xqdoc:namespace prefix="BufferedImageBuilder" uri="java:net.coobird.thumbnailator.builders.BufferedImageBuilder"/>
|
|
||||||
<xqdoc:namespace prefix="Builder" uri="java:net.coobird.thumbnailator.Thumbnails$Builder"/>
|
|
||||||
</xqdoc:namespaces>
|
|
||||||
<xqdoc:imports/>
|
|
||||||
<xqdoc:variables/>
|
|
||||||
<xqdoc:functions>
|
|
||||||
<xqdoc:function arity="1">
|
|
||||||
<xqdoc:name>fromFilenames</xqdoc:name>
|
|
||||||
<xqdoc:signature>declare function fromFilenames($file as xs:string)</xqdoc:signature>
|
|
||||||
<xqdoc:parameters>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>file</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:string</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
</xqdoc:parameters>
|
|
||||||
<xqdoc:return>
|
|
||||||
<xqdoc:type occurrence="*">item()</xqdoc:type>
|
|
||||||
</xqdoc:return>
|
|
||||||
</xqdoc:function>
|
|
||||||
<xqdoc:function arity="4">
|
|
||||||
<xqdoc:name>sourceRegion</xqdoc:name>
|
|
||||||
<xqdoc:signature>declare function sourceRegion($x as xs:integer, $y as xs:integer, $width as xs:integer, $height as xs:integer)</xqdoc:signature>
|
|
||||||
<xqdoc:parameters>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>x</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>y</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>width</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>height</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
</xqdoc:parameters>
|
|
||||||
<xqdoc:return>
|
|
||||||
<xqdoc:type occurrence="*">item()</xqdoc:type>
|
|
||||||
</xqdoc:return>
|
|
||||||
</xqdoc:function>
|
|
||||||
<xqdoc:function arity="3">
|
|
||||||
<xqdoc:name>size</xqdoc:name>
|
|
||||||
<xqdoc:signature>declare function size($builder, $width as xs:int, $height as xs:int)</xqdoc:signature>
|
|
||||||
<xqdoc:parameters>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>builder</xqdoc:name>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>width</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:int</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>height</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:int</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
</xqdoc:parameters>
|
|
||||||
<xqdoc:return>
|
|
||||||
<xqdoc:type occurrence="*">item()</xqdoc:type>
|
|
||||||
</xqdoc:return>
|
|
||||||
</xqdoc:function>
|
|
||||||
<xqdoc:function arity="4">
|
|
||||||
<xqdoc:name>make</xqdoc:name>
|
|
||||||
<xqdoc:signature>declare function make($src as xs:string, $dest as xs:string, $width as xs:integer, $height as xs:integer)</xqdoc:signature>
|
|
||||||
<xqdoc:parameters>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>src</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:string</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>dest</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:string</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>width</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
<xqdoc:parameter>
|
|
||||||
<xqdoc:name>height</xqdoc:name>
|
|
||||||
<xqdoc:type>xs:integer</xqdoc:type>
|
|
||||||
</xqdoc:parameter>
|
|
||||||
</xqdoc:parameters>
|
|
||||||
<xqdoc:return>
|
|
||||||
<xqdoc:type occurrence="*">item()</xqdoc:type>
|
|
||||||
</xqdoc:return>
|
|
||||||
</xqdoc:function>
|
|
||||||
</xqdoc:functions>
|
|
||||||
</xqdoc:xqdoc>
|
|
||||||
16
makejar.jardesc
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?>
|
||||||
|
<jardesc>
|
||||||
|
<jar path="ex-thumbnailator/src/main/content/thumbhelper-0.4.17.jar"/>
|
||||||
|
<options buildIfNeeded="true" compress="true" descriptionLocation="/ex-thumbnailator/makejar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
|
||||||
|
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
|
||||||
|
<selectedProjects/>
|
||||||
|
<manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
|
||||||
|
<sealing sealJar="false">
|
||||||
|
<packagesToSeal/>
|
||||||
|
<packagesToUnSeal/>
|
||||||
|
</sealing>
|
||||||
|
</manifest>
|
||||||
|
<selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false">
|
||||||
|
<javaElement handleIdentifier="=ex-thumbnailator/src\/java"/>
|
||||||
|
</selectedElements>
|
||||||
|
</jardesc>
|
||||||
10
package.xml
|
|
@ -1,7 +1,7 @@
|
||||||
<!-- @see http://cxan.org/faq#add-pkg -->
|
<!-- @see http://cxan.org/faq#add-pkg -->
|
||||||
<repo abbrev="ex-thumbnailator">
|
<repo abbrev="ex-thumbnailator">
|
||||||
<pkg abbrev="ex-thumbnailator" id="expkg-zone58.image.thumbnailator">
|
<pkg abbrev="ex-thumbnailator" id="https://github.com/expkg-zone58/ex-thumbnailator">
|
||||||
<name>expkg-zone58.image.thumbnailator</name>
|
<name>https://github.com/expkg-zone58/ex-thumbnailator</name>
|
||||||
<abstract>Create a thumbnail from a file path.</abstract>
|
<abstract>Create a thumbnail from a file path.</abstract>
|
||||||
<author id="coobird">coobird</author>
|
<author id="coobird">coobird</author>
|
||||||
<maintainer id="abunce">Andy Bunce</maintainer>
|
<maintainer id="abunce">Andy Bunce</maintainer>
|
||||||
|
|
@ -10,11 +10,7 @@
|
||||||
<tag>image</tag>
|
<tag>image</tag>
|
||||||
<tag>resize</tag>
|
<tag>resize</tag>
|
||||||
<tag>graphic</tag>
|
<tag>graphic</tag>
|
||||||
<version num="2.0.0">
|
<version num="4.1.4">
|
||||||
<dependency processor="basex"/>
|
|
||||||
<file name="ex-dotml-0.0.5.xar" role="pkg"/>
|
|
||||||
</version>
|
|
||||||
<version num="2.0.1">
|
|
||||||
<!-- generated: {fn:current-dateTime()} -->
|
<!-- generated: {fn:current-dateTime()} -->
|
||||||
</version>
|
</version>
|
||||||
</pkg>
|
</pkg>
|
||||||
|
|
|
||||||
54
readme.md
|
|
@ -1,25 +1,51 @@
|
||||||
# expkg-zone58.image.thumbnailator
|
# expkg-zone58.image.thumbnailator
|
||||||
An XQuery interface to the thumbnail generator library
|
An XQuery interface to the thumbnail generator library
|
||||||
[thumbnailator](https://github.com/coobird/thumbnailator)
|
[thumbnailator](https://github.com/coobird/thumbnailator).
|
||||||
|
|
||||||
Tested against BaseX 8.4.3.
|
Tested against BaseX 8.6.2
|
||||||
|
|
||||||
|
|
||||||
# Installation
|
## Usage
|
||||||
|
|
||||||
|
### Simple
|
||||||
|
|
||||||
|
```xquery
|
||||||
|
import module namespace t="expkg-zone58:image.thumbnailator";
|
||||||
|
|
||||||
|
fetch:binary("http://images.metmuseum.org/CRDImages/ep/original/DT46.jpg")
|
||||||
|
=>t:scale(80,60)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tasks
|
||||||
|
This function takes an XML description of the operations to apply to generate the thumbnail.
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<thumbnail>
|
||||||
|
<size width="500" height="500"/>
|
||||||
|
<filters>
|
||||||
|
<colorize color="green" alpha=".5"/>
|
||||||
|
<caption position="CENTER">Some Text here</caption>
|
||||||
|
<rotate angle="15"/>
|
||||||
|
<canvas height="500" width="500" position="TOP_LEFT" color="black"/>
|
||||||
|
<watermark src="{$watermark}" alpha=".5" position="TOP_LEFT"/>
|
||||||
|
</filters>
|
||||||
|
</thumbnail>
|
||||||
|
```
|
||||||
|
A schema is provided.
|
||||||
|
|
||||||
|
## Installation
|
||||||
The library is packaged in the [EXpath](http://expath.org/spec/pkg) xar format with
|
The library is packaged in the [EXpath](http://expath.org/spec/pkg) xar format with
|
||||||
the thumbnailator jar included. It can be installed into the BaseX repository by
|
the thumbnailator jar included. See releases for installation instructions.
|
||||||
executing the command:
|
|
||||||
````
|
|
||||||
repo:install('https://github.com/expkg-zone58/ex-thumbnailator/dist/thumbnailator.zar')
|
|
||||||
````
|
|
||||||
# Usage
|
|
||||||
````
|
|
||||||
import module namespace t="expkg-zone58.image.thumbnailator";
|
|
||||||
t:create-thumbnail("/tmp/pic.jpg","/tmp/small.jpg",120,120)
|
|
||||||
````
|
|
||||||
# Tests
|
# Tests
|
||||||
`test.xqm` script uses the BaseX [Unit module](http://docs.basex.org/wiki/Unit_Module)
|
`test.xqm` script uses the BaseX [Unit module](http://docs.basex.org/wiki/Unit_Module)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
* ex-thumbnailator Copyright (c) 2017, Andy Bunce. (Apache 2 License).
|
||||||
|
* thumbnailator Copyright (c) Chris Kroells (MIT License).
|
||||||
|
|
||||||
# todo
|
# todo
|
||||||
|
|
||||||
explore java binding limits and fluent interface
|
scale sourceregion
|
||||||
256
src/java/org/expkgzone58/image/Thumbs.java
Normal file
|
|
@ -0,0 +1,256 @@
|
||||||
|
package org.expkgzone58.image;
|
||||||
|
|
||||||
|
import static org.basex.query.QueryError.IOERR_X;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Font;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
import org.basex.io.IOContent;
|
||||||
|
import org.basex.query.QueryException;
|
||||||
|
import org.basex.query.QueryModule;
|
||||||
|
//import org.basex.query.func.fn.FnTrace;
|
||||||
|
import org.basex.query.value.item.B64Stream;
|
||||||
|
import org.basex.query.value.item.Dbl;
|
||||||
|
import org.basex.query.value.item.Int;
|
||||||
|
import org.basex.query.value.node.ANode;
|
||||||
|
import org.basex.util.Token;
|
||||||
|
import org.basex.data.Data;
|
||||||
|
|
||||||
|
import net.coobird.thumbnailator.ThumbnailParameter;
|
||||||
|
import net.coobird.thumbnailator.Thumbnailator;
|
||||||
|
import net.coobird.thumbnailator.builders.ThumbnailParameterBuilder;
|
||||||
|
import net.coobird.thumbnailator.filters.Pipeline;
|
||||||
|
import net.coobird.thumbnailator.filters.Rotation;
|
||||||
|
import net.coobird.thumbnailator.filters.Watermark;
|
||||||
|
import net.coobird.thumbnailator.geometry.Position;
|
||||||
|
import net.coobird.thumbnailator.geometry.Positions;
|
||||||
|
import net.coobird.thumbnailator.geometry.Region;
|
||||||
|
import net.coobird.thumbnailator.geometry.Size;
|
||||||
|
import net.coobird.thumbnailator.tasks.StreamThumbnailTask;
|
||||||
|
import net.coobird.thumbnailator.filters.Canvas;
|
||||||
|
import net.coobird.thumbnailator.filters.Caption;
|
||||||
|
import net.coobird.thumbnailator.filters.Colorize;
|
||||||
|
import net.coobird.thumbnailator.filters.Flip;
|
||||||
|
import net.coobird.thumbnailator.filters.ImageFilter;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* BaseX Thumbnailator interface
|
||||||
|
* @author andy bunce
|
||||||
|
* @copyright Quodatum Ltd
|
||||||
|
* @date 2017
|
||||||
|
* @licence Apache 2
|
||||||
|
*/
|
||||||
|
public class Thumbs extends QueryModule{
|
||||||
|
|
||||||
|
public static B64Stream size(final B64Stream inputStream, final int width, final int height)
|
||||||
|
throws IOException, QueryException {
|
||||||
|
ByteArrayInputStream is = new ByteArrayInputStream(inputStream.binary(null));
|
||||||
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
ThumbnailParameterBuilder builder = new ThumbnailParameterBuilder();
|
||||||
|
builder.size(new Dimension(width, height));
|
||||||
|
StreamThumbnailTask task = new StreamThumbnailTask(builder.build(), is, os);
|
||||||
|
Thumbnailator.createThumbnail(task);
|
||||||
|
return new B64Stream(new IOContent(os.toByteArray()), IOERR_X);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static B64Stream scale(final B64Stream inputStream,
|
||||||
|
final double xscale, final double yscale)
|
||||||
|
throws IOException, QueryException {
|
||||||
|
ByteArrayInputStream is = new ByteArrayInputStream(inputStream.binary(null));
|
||||||
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
ThumbnailParameterBuilder builder = new ThumbnailParameterBuilder();
|
||||||
|
builder.scale(xscale, yscale);
|
||||||
|
StreamThumbnailTask task = new StreamThumbnailTask(builder.build(), is, os);
|
||||||
|
Thumbnailator.createThumbnail(task);
|
||||||
|
return new B64Stream(new IOContent(os.toByteArray()), IOERR_X);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static B64Stream task(final B64Stream inputStream, final ANode thumbnail)
|
||||||
|
throws IOException, QueryException {
|
||||||
|
ByteArrayInputStream is = new ByteArrayInputStream(inputStream.binary(null));
|
||||||
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
ThumbnailParameter param = fromNode(thumbnail);
|
||||||
|
StreamThumbnailTask task = new StreamThumbnailTask(param, is, os);
|
||||||
|
Thumbnailator.createThumbnail(task);
|
||||||
|
return new B64Stream(new IOContent(os.toByteArray()), IOERR_X);
|
||||||
|
}
|
||||||
|
|
||||||
|
// build parameters from XML
|
||||||
|
static ThumbnailParameter fromNode(final ANode node) throws QueryException, IOException {
|
||||||
|
ThumbnailParameterBuilder builder = new ThumbnailParameterBuilder();
|
||||||
|
Iterator<ANode> itr = node.children().iterator();
|
||||||
|
while (itr.hasNext()) {
|
||||||
|
ANode element = itr.next();
|
||||||
|
if (element.kind() == Data.ELEM) {
|
||||||
|
String name = Token.string(element.name());
|
||||||
|
switch (name) {
|
||||||
|
|
||||||
|
case "size":
|
||||||
|
size(builder, element);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "scale":
|
||||||
|
scale(builder, element);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "region":
|
||||||
|
region(builder, element);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "exif-orientation":
|
||||||
|
exif(builder, element);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "filters":
|
||||||
|
List<ImageFilter> filters = filters(element);
|
||||||
|
builder.filters(filters);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return builder.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void region(final ThumbnailParameterBuilder builder, final ANode node)
|
||||||
|
throws QueryException {
|
||||||
|
|
||||||
|
int width = (int) Int.parse(node.attribute("width"), null);
|
||||||
|
int height = (int) Int.parse(node.attribute("height"), null);
|
||||||
|
Dimension d = new Dimension(width, height);
|
||||||
|
Position pos = Utils.position(node, "position", Positions.CENTER);
|
||||||
|
Region r = new Region(pos, (Size) d);
|
||||||
|
builder.region(r);
|
||||||
|
}
|
||||||
|
static void exif(final ThumbnailParameterBuilder builder, final ANode node)
|
||||||
|
throws QueryException {
|
||||||
|
boolean use = Utils.attrib(node, "use", true);
|
||||||
|
builder.useExifOrientation(use);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void size(final ThumbnailParameterBuilder builder, final ANode node)
|
||||||
|
throws QueryException {
|
||||||
|
int width = (int) Int.parse(node.attribute("width"), null);
|
||||||
|
int height = (int) Int.parse(node.attribute("height"), null);
|
||||||
|
builder.size(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void scale(final ThumbnailParameterBuilder builder, final ANode node)
|
||||||
|
throws QueryException {
|
||||||
|
double x = Utils.attrib(node, "x", 0.5f);
|
||||||
|
double y = Utils.attrib(node, "y", 0.5f);
|
||||||
|
builder.scale(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<ImageFilter> filters(final ANode filters) throws QueryException, IOException {
|
||||||
|
Pipeline pipeline = new Pipeline();
|
||||||
|
Iterator<ANode> itr = filters.children().iterator();
|
||||||
|
while (itr.hasNext()) {
|
||||||
|
ANode node = itr.next();
|
||||||
|
if (node.kind() == Data.ELEM) {
|
||||||
|
switch (Token.string(node.name())) {
|
||||||
|
|
||||||
|
case "canvas": // @width @height @color @position
|
||||||
|
canvas(pipeline, node);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "caption": //@color @position text()
|
||||||
|
caption(pipeline, node);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "colorize": //@color @alpha
|
||||||
|
colorize(pipeline, node);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "flip": //@axis
|
||||||
|
flip(pipeline, node);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "rotate": //@angle
|
||||||
|
rotate(pipeline, node);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "watermark": //@src @alpha @position
|
||||||
|
watermark(pipeline, node);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pipeline.getFilters();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void watermark(final Pipeline pipeline, final ANode node)
|
||||||
|
throws IOException, QueryException {
|
||||||
|
ImageFilter filter;
|
||||||
|
Position pos;
|
||||||
|
String src = Token.string(node.attribute("src"));
|
||||||
|
pos = Utils.position(node, "position", Positions.BOTTOM_RIGHT);
|
||||||
|
BufferedImage watermarkImg = ImageIO.read(new File(src));
|
||||||
|
filter = new Watermark(pos, watermarkImg, Utils.attrib(node, "alpha", 0.5f));
|
||||||
|
pipeline.add(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void rotate(final Pipeline pipeline, final ANode node)
|
||||||
|
throws QueryException {
|
||||||
|
double angle = (double) Dbl.parse(node.attribute("angle"), null);
|
||||||
|
pipeline.add(Rotation.newRotator(angle));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void flip(final Pipeline pipeline, final ANode node) {
|
||||||
|
ImageFilter filter;
|
||||||
|
String axis = Token.string(node.attribute("axis"));
|
||||||
|
// FnTrace.trace(axis.getBytes(), "FLIP: ".getBytes(), queryContext);
|
||||||
|
filter = axis.equalsIgnoreCase("vertical") ? Flip.VERTICAL : Flip.HORIZONTAL;
|
||||||
|
pipeline.add(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void colorize(final Pipeline pipeline, final ANode node) throws QueryException {
|
||||||
|
ImageFilter filter;
|
||||||
|
String color;
|
||||||
|
color = Utils.attrib(node, "color", "black");
|
||||||
|
filter = new Colorize(Utils.stringToColor(color),
|
||||||
|
Utils.attrib(node, "alpha", 0.0f));
|
||||||
|
pipeline.add(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void canvas(final Pipeline pipeline, final ANode node) throws QueryException {
|
||||||
|
ImageFilter filter;
|
||||||
|
String color;
|
||||||
|
Position pos;
|
||||||
|
int width = (int) Int.parse(node.attribute("width"), null);
|
||||||
|
int height = (int) Int.parse(node.attribute("height"), null);
|
||||||
|
color = Utils.attrib(node, "color", "black");
|
||||||
|
pos = Utils.position(node, "position", Positions.CENTER);
|
||||||
|
filter = new Canvas(width, height, pos, false, Utils.stringToColor(color));
|
||||||
|
pipeline.add(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void caption(final Pipeline pipeline, final ANode node) throws QueryException {
|
||||||
|
ImageFilter filter;
|
||||||
|
String color;
|
||||||
|
Position pos;
|
||||||
|
String text = Token.string(node.string());
|
||||||
|
color = Utils.attrib(node, "color", "black");
|
||||||
|
pos = Utils.position(node, "position", Positions.TOP_CENTER);
|
||||||
|
String fontName = Utils.attrib(node, "font", "SansSerif");
|
||||||
|
int size = Utils.attrib(node, "size", 14);
|
||||||
|
Font font = new Font(fontName, Font.PLAIN, size);
|
||||||
|
filter = new Caption(text, font , Utils.stringToColor(color),
|
||||||
|
pos, 0);
|
||||||
|
pipeline.add(filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
71
src/java/org/expkgzone58/image/Utils.java
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
package org.expkgzone58.image;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
import org.basex.query.QueryException;
|
||||||
|
import org.basex.query.value.item.Bln;
|
||||||
|
import org.basex.query.value.item.Dbl;
|
||||||
|
import org.basex.query.value.item.Int;
|
||||||
|
import org.basex.query.value.node.ANode;
|
||||||
|
import org.basex.util.Token;
|
||||||
|
|
||||||
|
import net.coobird.thumbnailator.geometry.Position;
|
||||||
|
import net.coobird.thumbnailator.geometry.Positions;
|
||||||
|
|
||||||
|
public final class Utils {
|
||||||
|
private Utils() {
|
||||||
|
};
|
||||||
|
// get value from attribute with default
|
||||||
|
public static String attrib(final ANode element, final String name, final String def)
|
||||||
|
throws QueryException {
|
||||||
|
byte[] at = element.attribute(name);
|
||||||
|
return (at == null) ? def : Token.string(at);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float attrib(final ANode element, final String name, final float def)
|
||||||
|
throws QueryException {
|
||||||
|
byte[] at = element.attribute(name);
|
||||||
|
return (at == null) ? def : (float) Dbl.parse(at, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int attrib(final ANode element, final String name, final int def)
|
||||||
|
throws QueryException {
|
||||||
|
byte[] at = element.attribute(name);
|
||||||
|
return (at == null) ? def : (int) Int.parse(at, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean attrib(final ANode element, final String name, final boolean def)
|
||||||
|
throws QueryException {
|
||||||
|
byte[] at = element.attribute(name);
|
||||||
|
return (at == null) ? def : (boolean) Bln.parse(at, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// e.g. TOP_LEFT
|
||||||
|
public static Position position(final ANode element, final String name, final Position def) {
|
||||||
|
byte[] at = element.attribute(name);
|
||||||
|
return (at == null) ? def : Positions.valueOf(Token.string(at));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Color stringToColor(final String value) {
|
||||||
|
if (value == null) {
|
||||||
|
return Color.black;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// get color by hex or octal value
|
||||||
|
return Color.decode(value);
|
||||||
|
} catch (NumberFormatException nfe) {
|
||||||
|
// if we can't decode lets try to get it by name
|
||||||
|
try {
|
||||||
|
// try to get a color by name using reflection
|
||||||
|
final Field f = Color.class.getField(value);
|
||||||
|
|
||||||
|
return (Color) f.get(null);
|
||||||
|
} catch (Exception ce) {
|
||||||
|
// if we can't get any color return black
|
||||||
|
return Color.black;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
<package xmlns="http://www.basex.org/modules/pkg">
|
<package xmlns="http://www.basex.org/modules/pkg">
|
||||||
|
<jar>thumbhelper-0.4.17.jar</jar>
|
||||||
<jar>thumbnailator-0.4.8.jar</jar>
|
<jar>thumbnailator-0.4.8.jar</jar>
|
||||||
<class>net.coobird.thumbnailator.Thumbnails</class>
|
<class>org.expkgzone58.image.Thumbs</class>
|
||||||
</package>
|
</package>
|
||||||
|
|
|
||||||
133
src/main/content/task.xsd
Normal file
|
|
@ -0,0 +1,133 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||||
|
<!-- thumbnail schema apb apr 2017 -->
|
||||||
|
<xs:element name="thumbnail">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:choice>
|
||||||
|
<xs:element ref="size" />
|
||||||
|
<xs:element ref="scale" />
|
||||||
|
</xs:choice>
|
||||||
|
<xs:element ref="region" minOccurs="0" />
|
||||||
|
<xs:element ref="exif-orientation" minOccurs="0" />
|
||||||
|
<xs:element ref="filters" minOccurs="0" />
|
||||||
|
</xs:sequence>
|
||||||
|
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="size">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="width" type="xs:int" />
|
||||||
|
<xs:attribute name="height" type="xs:int" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="scale">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="x" type="xs:double" />
|
||||||
|
<xs:attribute name="y" type="xs:double" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="region">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="height" type="xs:int" />
|
||||||
|
<xs:attribute name="width" type="xs:int" />
|
||||||
|
<xs:attribute name="position" type="PositionType" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="exif-orientation">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="use" type="xs:boolean" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="filters">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:choice maxOccurs="unbounded">
|
||||||
|
<xs:element ref="canvas" minOccurs="0" />
|
||||||
|
<xs:element ref="caption" minOccurs="0" />
|
||||||
|
<xs:element ref="colorize" minOccurs="0" />
|
||||||
|
<xs:element ref="flip" minOccurs="0" />
|
||||||
|
<xs:element ref="rotate" minOccurs="0" />
|
||||||
|
<xs:element ref="watermark" minOccurs="0" />
|
||||||
|
</xs:choice>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="canvas">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="height" type="xs:int" />
|
||||||
|
<xs:attribute name="width" type="xs:int" />
|
||||||
|
<xs:attribute name="color" type="xs:string" />
|
||||||
|
<xs:attribute name="position" type="PositionType" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="colorize">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="color" type="xs:string" />
|
||||||
|
<xs:attribute name="alpha" type="xs:float" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="caption">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:simpleContent>
|
||||||
|
<xs:extension base="xs:string">
|
||||||
|
<xs:attribute name="size" type="xs:int" />
|
||||||
|
<xs:attribute name="font" type="xs:string" />
|
||||||
|
<xs:attribute name="color" type="xs:string" />
|
||||||
|
<xs:attribute name="position" type="PositionType" />
|
||||||
|
</xs:extension>
|
||||||
|
</xs:simpleContent>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="flip">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="axis" type="AxisType" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="rotate">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="angle" type="xs:float" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="watermark">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="src" type="xs:string" />
|
||||||
|
<xs:attribute name="position" type="PositionType" />
|
||||||
|
<xs:attribute name="alpha" type="xs:float" />
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
|
||||||
|
<xs:simpleType name="AxisType">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="horizontal" />
|
||||||
|
<xs:enumeration value="vertical" />
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<xs:simpleType name="PositionType">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="TOP_LEFT" />
|
||||||
|
<xs:enumeration value="TOP_CENTER" />
|
||||||
|
<xs:enumeration value="TOP_RIGHT" />
|
||||||
|
|
||||||
|
<xs:enumeration value="MIDDLE_LEFT" />
|
||||||
|
<xs:enumeration value="CENTER" />
|
||||||
|
<xs:enumeration value="MIDDLE_RIGHT" />
|
||||||
|
|
||||||
|
<xs:enumeration value="BOTTOM_LEFT" />
|
||||||
|
<xs:enumeration value="BOTTOM_CENTER" />
|
||||||
|
<xs:enumeration value="BOTTOM_RIGHT" />
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
</xs:schema>
|
||||||
BIN
src/main/content/thumbhelper-0.4.17.jar
Normal file
|
|
@ -1,40 +1,52 @@
|
||||||
xquery version "3.0" encoding "UTF-8";
|
xquery version "3.1" encoding "UTF-8";
|
||||||
(:~ Generate thumbnails using http://code.google.com/p/thumbnailator/
|
(:~ Generate image thumbnails using the thumbnailator library.
|
||||||
|
: @see https://github.com/coobird/thumbnailator
|
||||||
: @author andy bunce
|
: @author andy bunce
|
||||||
|
: @version 4.4.1
|
||||||
:)
|
:)
|
||||||
module namespace thumbnails = 'expkg-zone58.image.thumbnailator';
|
module namespace thumbnails = 'expkg-zone58:image.thumbnailator';
|
||||||
declare default function namespace 'expkg-zone58.image.thumbnailator';
|
|
||||||
|
|
||||||
declare namespace File="java:java.io.File";
|
(:~
|
||||||
declare namespace Thumbnailator="java:net.coobird.thumbnailator.Thumbnailator";
|
: generate scaled version of source image with maximum dimension of size
|
||||||
declare namespace BufferedImageBuilder="java:net.coobird.thumbnailator.builders.BufferedImageBuilder";
|
: @param $source base64Binary (streamed?) e.g from `fetch:binary`
|
||||||
declare namespace Builder="java:net.coobird.thumbnailator.Thumbnails$Builder";
|
: @result base64Binary for thumbnail
|
||||||
(:
|
:)
|
||||||
Thumbnails.of(new File("path/to/directory").listFiles())
|
declare function thumbnails:size($source as xs:base64Binary,$width as xs:integer,$height as xs:integer)
|
||||||
.size(640, 480)
|
as xs:base64Binary
|
||||||
.outputFormat("jpg")
|
{
|
||||||
.toFiles(Rename.PREFIX_DOT_THUMBNAIL);
|
Q{java:org.expkgzone58.image.Thumbs}size($source,xs:int($width),xs:int($height))
|
||||||
:)
|
|
||||||
(: declare function fromFilenames($file as xs:string){
|
|
||||||
let $a:=File:new(file:path-to-native($file))
|
|
||||||
return Builder:of(($a,$a))
|
|
||||||
}; :)
|
|
||||||
|
|
||||||
declare function sourceRegion($x as xs:integer,$y as xs:integer,
|
|
||||||
$width as xs:integer,$height as xs:integer){
|
|
||||||
Builder:sourceRegion(xs:int($x),xs:int($y),xs:int($width),xs:int($height))
|
|
||||||
};
|
|
||||||
|
|
||||||
declare function size($builder,$width as xs:int,$height as xs:int){
|
|
||||||
BufferedImageBuilder:size($builder,$width,$height)
|
|
||||||
};
|
|
||||||
|
|
||||||
declare function create-thumbnail($src as xs:string,
|
|
||||||
$dest as xs:string,
|
|
||||||
$width as xs:integer,
|
|
||||||
$height as xs:integer){
|
|
||||||
let $src:=File:new(file:resolve-path($src))
|
|
||||||
let $dest:=File:new(file:resolve-path($dest))
|
|
||||||
return Thumbnailator:createThumbnail($src,$dest,xs:int($width),xs:int($height))
|
|
||||||
};
|
};
|
||||||
|
(:~
|
||||||
|
: generate scaled version of source image at given factors 0-1
|
||||||
|
: @param $source base64Binary (streamed?) e.g from `fetch:binary`
|
||||||
|
: @result base64Binary for thumbnail
|
||||||
|
:)
|
||||||
|
declare function thumbnails:scale($source as xs:base64Binary,$xscale as xs:float,$yscale as xs:float)
|
||||||
|
as xs:base64Binary
|
||||||
|
{
|
||||||
|
Q{java:org.expkgzone58.image.Thumbs}scale($source,$xscale,$yscale)
|
||||||
|
};
|
||||||
|
|
||||||
|
(:~
|
||||||
|
: generate thumbnail using parameters specified via XML
|
||||||
|
: @param $source base64Binary (streamed?) e.g from `fetch:binary`
|
||||||
|
: @param $task XML parameters <task><size width="100" ..
|
||||||
|
: @result base64Binary for thumbnail
|
||||||
|
:)
|
||||||
|
declare function thumbnails:task($source as xs:base64Binary,
|
||||||
|
$task as element(task))
|
||||||
|
as xs:base64Binary
|
||||||
|
{
|
||||||
|
Q{java:org.expkgzone58.image.Thumbs}task($source,$task)
|
||||||
|
};
|
||||||
|
|
||||||
|
(:~
|
||||||
|
: validate task XML against schema
|
||||||
|
: @param $src XML parameters <task><size width="100" ..
|
||||||
|
: @result validation report
|
||||||
|
:)
|
||||||
|
declare function thumbnails:validation-report($src)
|
||||||
|
as element(report)
|
||||||
|
{
|
||||||
|
validate:xsd-report($src,"task.xsd")
|
||||||
|
};
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<package xmlns="http://cxan.org/ns/package" id="thumbnailator">
|
<package xmlns="http://cxan.org/ns/package" id="thumbnailator">
|
||||||
<abstract>Create a thumbnail from a file path. </abstract>
|
<abstract>XQuery interface to the thumbnail generator library: thumbnailator</abstract>
|
||||||
<author id="coobird">coobird</author>
|
<author id="coobird">coobird</author>
|
||||||
<maintainer id="abunce">Andy Bunce</maintainer>
|
<maintainer id="abunce">Andy Bunce</maintainer>
|
||||||
<home>https://github.com/coobird/thumbnailator</home>
|
<home>https://github.com/coobird/thumbnailator</home>
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
<package xmlns="http://expath.org/ns/pkg"
|
<package xmlns="http://expath.org/ns/pkg" name="https://github.com/expkg-zone58/ex-thumbnailator"
|
||||||
name="expkg-zone58.image.thumbnailator"
|
abbrev="thumbnailator" version="4.1.4" spec="1.0">
|
||||||
abbrev="thumbnailator"
|
|
||||||
version="2.0.1"
|
|
||||||
spec="1.0">
|
|
||||||
|
|
||||||
<title>Generate thumbnails using http://code.google.com/p/thumbnailator/</title>
|
|
||||||
<dependency processor="basex" />
|
|
||||||
<xquery>
|
|
||||||
<namespace>expkg-zone58.image.thumbnailator</namespace>
|
|
||||||
<file>thumbnailator.xqm</file>
|
|
||||||
</xquery>
|
|
||||||
|
|
||||||
|
<title>An XQuery interface to thumbnailator the thumbnail generator library.</title>
|
||||||
|
<dependency processor="basex" />
|
||||||
|
<xquery>
|
||||||
|
<namespace>expkg-zone58:image.thumbnailator</namespace>
|
||||||
|
<file>thumbnailator.xqm</file>
|
||||||
|
</xquery>
|
||||||
|
<xsd>
|
||||||
|
<import-uri>expkg-zone58:image.thumbnailator/schema/task.xsd</import-uri>
|
||||||
|
<file>task.xsd</file>
|
||||||
|
</xsd>
|
||||||
</package>
|
</package>
|
||||||
|
|
|
||||||
18
src/test/builder.xml
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
<thumbnail>
|
||||||
|
<!-- http://programtalk.com/java-api-usage-examples/net.coobird.thumbnailator.tasks.io.InputStreamImageSource/
|
||||||
|
ThumbnailParameterBuilder p=new ThumbnailParameterBuilder(); switch (element)
|
||||||
|
{ case "size": p.size(); break; .... ThumbnailParameter tp=p.build() } -->
|
||||||
|
<size x="200" y="89" />
|
||||||
|
<scale x="1" y="1" />
|
||||||
|
<sourceRegion x="0" y="0" width="100" height="100" />
|
||||||
|
<filters>
|
||||||
|
|
||||||
|
<canvas width="300" height="400" position=">?" crop="true"
|
||||||
|
fillColor="red" />
|
||||||
|
<caption >some text</caption>
|
||||||
|
<flip axis="vertical"/>
|
||||||
|
<colorize/>
|
||||||
|
<rotate angle="45" />
|
||||||
|
<watermark src="aa"/>
|
||||||
|
</filters>
|
||||||
|
</thumbnail>
|
||||||
BIN
src/test/out.jpg
|
Before Width: | Height: | Size: 1 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
BIN
src/test/resources/earth.jpg
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/test/resources/icon.jpg
Normal file
|
After Width: | Height: | Size: 2 KiB |
BIN
src/test/resources/result.jpg
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/test/resources/result2.jpg
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
8
src/test/rotate.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<thumbnail xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="expkg-zone58:image.thumbnailator/schema/task.xsd">
|
||||||
|
<size width="200" height="200" />
|
||||||
|
<filters>
|
||||||
|
<rotate angle="251" />
|
||||||
|
<rotate angle="1" />
|
||||||
|
</filters>
|
||||||
|
</thumbnail>
|
||||||
12
src/test/sample-task.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
<thumbnail xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="expkg-zone58:image.thumbnailator/schema/task.xsd">
|
||||||
|
<size width="500" height="500" />
|
||||||
|
<filters>
|
||||||
|
<colorize color="#FF0096" alpha=".4" />
|
||||||
|
<caption position="CENTER" color="white" size="30" font="SansSerif">Some Text here</caption>
|
||||||
|
|
||||||
|
<rotate angle="15" />
|
||||||
|
<canvas height="500" width="500" position="TOP_LEFT" color="black" />
|
||||||
|
<watermark src="{$watermark}" alpha=".8" position="TOP_LEFT" />
|
||||||
|
</filters>
|
||||||
|
</thumbnail>
|
||||||
22
src/test/sample.xq
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
import module namespace t="expkg-zone58:image.thumbnailator";
|
||||||
|
|
||||||
|
declare variable $pic1:=resolve-uri("resources/simple.jpg");
|
||||||
|
declare variable $picr:=resolve-uri("resources/result2.jpg");
|
||||||
|
declare variable $remote:="http://images.metmuseum.org/CRDImages/ep/original/DT46.jpg";
|
||||||
|
declare variable $watermark:="C:\Users\andy\git\ex-thumbnailator\src\test\resources\icon.jpg";
|
||||||
|
let $task:=<thumbnail>
|
||||||
|
<size width="500" height="500"/>
|
||||||
|
<filters>
|
||||||
|
<colorize color="#FF0096" alpha=".4"/>
|
||||||
|
<caption position="CENTER" color="white" size="30" font="SansSerif">Some Text here</caption>
|
||||||
|
|
||||||
|
<rotate angle="15"/>
|
||||||
|
<canvas height="500" width="500" position="TOP_LEFT" color="black"/>
|
||||||
|
<watermark src="{$watermark}" alpha=".8" position="TOP_LEFT"/>
|
||||||
|
</filters>
|
||||||
|
</thumbnail>
|
||||||
|
(: let $task:=doc("rotate.xml")/task :)
|
||||||
|
let $x:=fetch:binary($remote)
|
||||||
|
(: let $r:=Q{java:org.expkgzone58.image.Thumbs}size($x,xs:int(40),xs:int(40)) :)
|
||||||
|
let $r:=Q{java:org.expkgzone58.image.Thumbs}task($x,$task)
|
||||||
|
return file:write-binary($picr,$r)
|
||||||
|
|
@ -2,20 +2,39 @@ module namespace test = 'http://basex.org/modules/xqunit-tests';
|
||||||
(:~
|
(:~
|
||||||
: unit tests for thumbnail module
|
: unit tests for thumbnail module
|
||||||
:)
|
:)
|
||||||
import module namespace t="expkg-zone58.image.thumbnailator" at "../main/content/thumbnailator.xqm";
|
import module namespace t="expkg-zone58:image.thumbnailator" (: at "../main/content/thumbnailator.xqm" :);
|
||||||
declare namespace File="java:java.io.File";
|
|
||||||
|
|
||||||
declare variable $test:pic1:=resolve-uri("simple.jpg");
|
declare variable $test:pic1:=resolve-uri( "resources/simple.jpg");
|
||||||
declare variable $test:picr:=resolve-uri("out.jpg");
|
declare variable $test:picr:=resolve-uri( "resources/out.jpg");
|
||||||
|
declare variable $test:met:=<images>
|
||||||
|
<image src="http://images.metmuseum.org/CRDImages/rl/web-large/DT3136.jpg">
|
||||||
|
http://www.metmuseum.org/art/collection/search/459117
|
||||||
|
</image>
|
||||||
|
</images>;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(:~ make a thumbnail :)
|
(:~ make a thumbnail :)
|
||||||
declare
|
declare
|
||||||
%unit:test
|
%unit:test
|
||||||
function test:create-thumbnail() {
|
function test:size() {
|
||||||
let $r:=t:create-thumbnail($test:pic1,$test:picr,60,60)
|
let $r:=t:size(
|
||||||
return unit:assert(fn:empty($r))
|
fetch:binary(
|
||||||
|
$test:pic1
|
||||||
|
),60,60
|
||||||
|
)
|
||||||
|
return unit:assert(
|
||||||
|
$r instance of xs:base64Binary
|
||||||
|
)
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
(:~ make a thumbnail :)
|
||||||
|
declare
|
||||||
|
%unit:test
|
||||||
|
function test:validate() {
|
||||||
|
let $r:=t:validation-report(doc("rotate.xml"))
|
||||||
|
|
||||||
|
return unit:assert( $r )
|
||||||
|
|
||||||
|
};
|
||||||
2
src/test/validate.xq
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
import module namespace t="expkg-zone58:image.thumbnailator";
|
||||||
|
t:validate("C:/Users/andy/git/ex-thumbnailator/src/test/sample-task.xml")
|
||||||
|
|
@ -16,7 +16,7 @@ declare namespace pkg="http://expath.org/ns/pkg";
|
||||||
declare function files($src as xs:string) as xs:string*
|
declare function files($src as xs:string) as xs:string*
|
||||||
{
|
{
|
||||||
fn:filter(file:list($src,fn:true()),
|
fn:filter(file:list($src,fn:true()),
|
||||||
function ($f){file:is-file($src || $f)}
|
function ($f){($src || $f)=>fn:translate("\","/")=>file:is-file()}
|
||||||
)
|
)
|
||||||
!fn:translate(.,"\","/")
|
!fn:translate(.,"\","/")
|
||||||
};
|
};
|
||||||
|
|
@ -25,7 +25,7 @@ declare namespace pkg="http://expath.org/ns/pkg";
|
||||||
: write xqdoc for $src/$path to $dest
|
: write xqdoc for $src/$path to $dest
|
||||||
:)
|
:)
|
||||||
declare %updating function write-xqdoc($path,$src,$dest){
|
declare %updating function write-xqdoc($path,$src,$dest){
|
||||||
let $url:=fn:resolve-uri( $path,$src)
|
let $url:=fn:resolve-uri( $path,$src)=>fn:trace()
|
||||||
let $type:=fetch:content-type($url)
|
let $type:=fetch:content-type($url)
|
||||||
|
|
||||||
return switch($type)
|
return switch($type)
|
||||||
|
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
(: create o/ps
|
|
||||||
: xar package and xqdoc
|
|
||||||
:)
|
|
||||||
declare namespace pkg="http://expath.org/ns/pkg";
|
|
||||||
import module namespace build = "quodatum.utils.build" at "buildx.xqm";
|
|
||||||
declare variable $base:=resolve-uri("../");
|
|
||||||
declare variable $src:=resolve-uri("../src/main/");
|
|
||||||
declare variable $dest:=resolve-uri("../dist/");
|
|
||||||
|
|
||||||
(:~
|
|
||||||
: the package definition as a pkg:package
|
|
||||||
:)
|
|
||||||
declare variable $package as element(pkg:package) :=doc(resolve-uri("expath-pkg.xml",$src))/pkg:package;
|
|
||||||
|
|
||||||
declare variable $content:=resolve-uri("content/",$src);
|
|
||||||
declare variable $dest-doc:=resolve-uri("doc/",$dest);
|
|
||||||
|
|
||||||
|
|
||||||
build:files($src)
|
|
||||||