📄 image.cfc
字号:
<cfscript>
// initialize the posterize filter
variables.posterizeFilter.init(arguments.amount);
destImage = variables.posterizeFilter.filter(srcImage);
if (outputFile eq "")
{
// return the image object
retVal.img = destImage;
return retVal;
} else {
// write the image object to the specified file.
saveImage = writeImage(outputFile, destImage, jpegCompression);
if (saveImage.errorCode gt 0)
{
return saveImage;
} else {
return retVal;
}
}
</cfscript>
</cffunction>
<cffunction name="addText" access="public" output="true" returntype="struct" hint="Add text to an image.">
<cfargument name="objImage" required="yes" type="Any">
<cfargument name="inputFile" required="yes" type="string">
<cfargument name="outputFile" required="yes" type="string">
<cfargument name="x" required="yes" type="numeric">
<cfargument name="y" required="yes" type="numeric">
<cfargument name="fontDetails" required="yes" type="struct">
<cfargument name="content" required="yes" type="String">
<cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
<cfset var retVal = StructNew()>
<cfset var loadImage = StructNew()>
<cfset var img = "">
<cfset var saveImage = StructNew()>
<cfset var g2d = "">
<cfset var bgImage = "">
<cfset var fontImage = "">
<cfset var overlayImage = "">
<cfset var Color = "">
<cfset var font = "">
<cfset var font_stream = "">
<cfset var ac = "">
<cfset var rgb = "">
<cfset retVal.errorCode = 0>
<cfset retVal.errorMessage = "">
<cfparam name="arguments.fontDetails.size" default="12">
<cfparam name="arguments.fontDetails.color" default="black">
<cfparam name="arguments.fontDetails.fontFile" default="">
<cfparam name="arguments.fontDetails.fontName" default="serif">
<cfif arguments.fontDetails.fontFile neq "" and not fileExists(arguments.fontDetails.fontFile)>
<cfset retVal = throw("The specified font file #Chr(34)##arguments.inputFile##Chr(34)# could not be found on the server.")>
<cfreturn retVal>
</cfif>
<cftry>
<cfset rgb = getRGB(arguments.fontDetails.color)>
<cfcatch type="any">
<cfset retVal = throw("Invalid color #Chr(34)##arguments.fontDetails.color##Chr(34)#")>
<cfreturn retVal>
</cfcatch>
</cftry>
<cfif inputFile neq "">
<cfset loadImage = readImage(inputFile, "NO")>
<cfif loadImage.errorCode is 0>
<cfset img = loadImage.img>
<cfelse>
<cfset retVal = throw(loadImage.errorMessage)>
<cfreturn retVal>
</cfif>
<cfelse>
<cfset img = objImage>
</cfif>
<cfif img.getType() eq 0>
<cfset img = convertImageObject(img,img.TYPE_3BYTE_BGR)>
</cfif>
<cfscript>
// load objects
bgImage = CreateObject("java", "java.awt.image.BufferedImage");
fontImage = CreateObject("java", "java.awt.image.BufferedImage");
overlayImage = CreateObject("java", "java.awt.image.BufferedImage");
Color = CreateObject("java","java.awt.Color");
font = createObject("java","java.awt.Font");
font_stream = createObject("java","java.io.FileInputStream");
ac = CreateObject("Java", "java.awt.AlphaComposite");
// set up basic needs
fontColor = Color.init(javacast("int", rgb.red), javacast("int", rgb.green), javacast("int", rgb.blue));
if (fontDetails.fontFile neq "")
{
font_stream.init(arguments.fontDetails.fontFile);
font = font.createFont(font.TRUETYPE_FONT, font_stream);
font = font.deriveFont(javacast("float",arguments.fontDetails.size));
} else {
font.init(fontDetails.fontName, evaluate(fontDetails.style), fontDetails.size);
}
// get font metrics using a 1x1 bufferedImage
fontImage.init(1,1,img.getType());
g2 = fontImage.createGraphics();
g2.setRenderingHints(getRenderingHints());
fc = g2.getFontRenderContext();
bounds = font.getStringBounds(content,fc);
g2 = img.createGraphics();
g2.setRenderingHints(getRenderingHints());
g2.setFont(font);
g2.setColor(fontColor);
// in case you want to change the alpha
// g2.setComposite(ac.getInstance(ac.SRC_OVER, 0.50));
// the location (arguments.fontDetails.size+y) doesn't really work
// the way I want it to.
g2.drawString(content,javacast("int",x),javacast("int",arguments.fontDetails.size+y));
if (outputFile eq "")
{
retVal.img = img;
return retVal;
} else {
saveImage = writeImage(outputFile, img, jpegCompression);
if (saveImage.errorCode gt 0)
{
return saveImage;
} else {
return retVal;
}
}
</cfscript>
</cffunction>
<cffunction name="watermark" access="public" output="false">
<cfargument name="objImage1" required="yes" type="Any">
<cfargument name="objImage2" required="yes" type="Any">
<cfargument name="inputFile1" required="yes" type="string">
<cfargument name="inputFile2" required="yes" type="string">
<cfargument name="alpha" required="yes" type="numeric">
<cfargument name="placeAtX" required="yes" type="numeric">
<cfargument name="placeAtY" required="yes" type="numeric">
<cfargument name="outputFile" required="yes" type="string">
<cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
<cfset var retVal = StructNew()>
<cfset var loadImage = StructNew()>
<cfset var originalImage = "">
<cfset var wmImage = "">
<cfset var saveImage = StructNew()>
<cfset var ac = "">
<cfset var rh = getRenderingHints()>
<cfset retVal.errorCode = 0>
<cfset retVal.errorMessage = "">
<cfif inputFile1 neq "">
<cfset loadImage = readImage(inputFile1, "NO")>
<cfif loadImage.errorCode is 0>
<cfset originalImage = loadImage.img>
<cfelse>
<cfset retVal = throw(loadImage.errorMessage)>
<cfreturn retVal>
</cfif>
<cfelse>
<cfset originalImage = objImage1>
</cfif>
<cfif originalImage.getType() eq 0>
<cfset originalImage = convertImageObject(originalImage,originalImage.TYPE_3BYTE_BGR)>
</cfif>
<cfif inputFile2 neq "">
<cfset loadImage = readImage(inputFile2, "NO")>
<cfif loadImage.errorCode is 0>
<cfset wmImage = loadImage.img>
<cfelse>
<cfset retVal = throw(loadImage.errorMessage)>
<cfreturn retVal>
</cfif>
<cfelse>
<cfset wmImage = objImage2>
</cfif>
<cfif wmImage.getType() eq 0>
<cfset wmImage = convertImageObject(wmImage,wmImage.TYPE_3BYTE_BGR)>
</cfif>
<cfscript>
at = CreateObject("java", "java.awt.geom.AffineTransform");
op = CreateObject("java", "java.awt.image.AffineTransformOp");
ac = CreateObject("Java", "java.awt.AlphaComposite");
gfx = originalImage.getGraphics();
gfx.setComposite(ac.getInstance(ac.SRC_OVER, alpha));
at.init();
// op.init(at,op.TYPE_BILINEAR);
op.init(at, rh);
gfx.drawImage(wmImage, op, javaCast("int",arguments.placeAtX), javacast("int", arguments.placeAtY));
gfx.dispose();
if (outputFile eq "")
{
retVal.img = originalImage;
return retVal;
} else {
saveImage = writeImage(outputFile, originalImage, jpegCompression);
if (saveImage.errorCode gt 0)
{
return saveImage;
} else {
return retVal;
}
}
</cfscript>
</cffunction>
<cffunction name="isURL" access="private" output="false" returnType="boolean">
<cfargument name="stringToCheck" required="yes" type="string">
<cfif REFindNoCase("^(((https?:)\/\/))[-[:alnum:]\?%,\.\/&##!@:=\+~_]+[A-Za-z0-9\/]$",stringToCheck) NEQ 0>
<cfreturn true>
<cfelse>
<cfreturn false>
</cfif>
</cffunction>
<!--- function returns RGB values in a structure for hex or the 16
HTML named colors --->
<cffunction name="getRGB" access="private" output="true" returnType="struct">
<cfargument name="color" type="string" required="yes">
<cfset var retVal = structNew()>
<cfset var cnt = 0>
<cfset var namedColors = "aqua,black,blue,fuchsia,gray,green,lime,maroon,navy,olive,purple,red,silver,teal,white,yellow">
<cfset var namedColorsHexValues = "00ffff,000000,0000ff,ff00ff,808080,008000,00ff00,800000,000080,808080,ff0000,c0c0c0,008080,ffffff,ffff00">
<cfset retVal.red = 0>
<cfset retVal.green = 0>
<cfset retVal.blue = 0>
<cfset arguments.color = trim(arguments.color)>
<cfif len(arguments.color) is 0>
<cfreturn retVal>
<cfelseif listFind(namedColors, arguments.color) gt 0>
<cfset arguments.color = listGetAt(namedColorsHexValues, listFind(namedColors, arguments.color))>
</cfif>
<cfif left(arguments.color,1) eq "##">
<cfset arguments.color = right(arguments.color,len(arguments.color)-1)>
</cfif>
<cfif len(arguments.color) neq 6>
<cfreturn retVal>
<cfelse>
<cftry>
<cfset retVal.red = InputBaseN(mid(arguments.color,1,2),16)>
<cfset retVal.green = InputBaseN(mid(arguments.color,3,2),16)>
<cfset retVal.blue = InputBaseN(mid(arguments.color,5,2),16)>
<cfcatch type="any">
<cfset retVal.red = 0>
<cfset retVal.green = 0>
<cfset retVal.blue = 0>
<cfreturn retVal>
</cfcatch>
</cftry>
</cfif>
<cfreturn retVal>
</cffunction>
<cffunction name="throw" access="private" output="false" returnType="struct">
<cfargument name="detail" type="string" required="yes">
<cfargument name="force" type="boolean" required="no" default="no">
<cfset var retVal = StructNew()>
<cfif variables.throwOnError or arguments.force>
<cfthrow detail="#arguments.detail#" message="#arguments.detail#">
<cfelse>
<cfset retVal.errorCode = 1>
<cfset retVal.errorMessage = arguments.detail>
<cfreturn retVal>
</cfif>
</cffunction>
<cffunction name="debugDump" access="private">
<cfdump var="#arguments#"><cfabort>
</cffunction>
<cffunction name="convertImageObject" access="private" output="false" returnType="any">
<cfargument name="bImage" type="Any" required="yes">
<cfargument name="type" type="numeric" required="yes">
<cfscript>
// convert the image to a specified BufferedImage type and return it
var width = bImage.getWidth();
var height = bImage.getHeight();
var newImage = createObject("java","java.awt.image.BufferedImage").init(javacast("int",width), javacast("int",height), javacast("int",type));
// int[] rgbArray = new int[width*height];
var rgbArray = variables.arrObj.newInstance(variables.intClass, javacast("int",width*height));
bImage.getRGB(
javacast("int",0),
javacast("int",0),
javacast("int",width),
javacast("int",height),
rgbArray,
javacast("int",0),
javacast("int",width)
);
newImage.setRGB(
javacast("int",0),
javacast("int",0),
javacast("int",width),
javacast("int",height),
rgbArray,
javacast("int",0),
javacast("int",width)
);
return newImage;
</cfscript>
</cffunction>
</cfcomponent>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -