📄 image.cfc
字号:
op.init(at.getScaleInstance(javacast("double",w),javacast("double",h)), rh);
// resizedImage = op.createCompatibleDestImage(img, img.getColorModel());
op.filter(img, resizedImage);
imgInfo = getimageinfo(resizedImage, "");
if (imgInfo.errorCode gt 0)
{
return imgInfo;
}
cropOffsetX = max( Int( (imgInfo.width/2) - (newWidth/2) ), 0 );
cropOffsetY = max( Int( (imgInfo.height/2) - (newHeight/2) ), 0 );
// There is a chance that the image is exactly the correct
// width and height and don't need to be cropped
if
(
preserveAspect and cropToExact
and
(imgInfo.width IS NOT specifiedWidth OR imgInfo.height IS NOT specifiedHeight)
)
{
// Get the correct offset to get the center of the image
cropOffsetX = max( Int( (imgInfo.width/2) - (specifiedWidth/2) ), 0 );
cropOffsetY = max( Int( (imgInfo.height/2) - (specifiedHeight/2) ), 0 );
cropImageResult = crop( resizedImage, "", "", cropOffsetX, cropOffsetY, specifiedWidth, specifiedHeight );
if ( cropImageResult.errorCode GT 0)
{
return cropImageResult;
} else {
resizedImage = cropImageResult.img;
}
}
if (outputFile eq "")
{
retVal.img = resizedImage;
return retVal;
} else {
saveImage = writeImage(outputFile, resizedImage, jpegCompression);
if (saveImage.errorCode gt 0)
{
return saveImage;
} else {
return retVal;
}
}
</cfscript>
</cffunction>
<cffunction name="crop" access="public" output="true" returntype="struct" hint="Crop 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="fromX" required="yes" type="numeric">
<cfargument name="fromY" required="yes" type="numeric">
<cfargument name="newWidth" required="yes" type="numeric">
<cfargument name="newHeight" required="yes" type="numeric">
<cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
<cfset var retVal = StructNew()>
<cfset var loadImage = StructNew()>
<cfset var saveImage = StructNew()>
<cfset var croppedImage = "">
<cfset var rh = getRenderingHints()>
<cfset var img = "">
<cfset retVal.errorCode = 0>
<cfset retVal.errorMessage = "">
<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>
if (fromX + newWidth gt img.getWidth()
OR
fromY + newHeight gt img.getHeight()
)
{
retval = throw( "The cropped image dimensions go beyond the original image dimensions.");
return retVal;
}
croppedImage = img.getSubimage(javaCast("int", fromX), javaCast("int", fromY), javaCast("int", newWidth), javaCast("int", newHeight) );
if (outputFile eq "")
{
retVal.img = croppedImage;
return retVal;
} else {
saveImage = writeImage(outputFile, croppedImage, jpegCompression);
if (saveImage.errorCode gt 0)
{
return saveImage;
} else {
return retVal;
}
}
</cfscript>
</cffunction>
<cffunction name="rotate" access="public" output="true" returntype="struct" hint="Rotate an image (+/-)90, (+/-)180, or (+/-)270 degrees.">
<cfargument name="objImage" required="yes" type="Any">
<cfargument name="inputFile" required="yes" type="string">
<cfargument name="outputFile" required="yes" type="string">
<cfargument name="degrees" required="yes" type="numeric">
<cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
<cfset var retVal = StructNew()>
<cfset var img = "">
<cfset var loadImage = StructNew()>
<cfset var saveImage = StructNew()>
<cfset var at = "">
<cfset var op = "">
<cfset var w = 0>
<cfset var h = 0>
<cfset var iw = 0>
<cfset var ih = 0>
<cfset var x = 0>
<cfset var y = 0>
<cfset var rotatedImage = "">
<cfset var rh = getRenderingHints()>
<cfset retVal.errorCode = 0>
<cfset retVal.errorMessage = "">
<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>
<cfif ListFind("-270,-180,-90,90,180,270",degrees) is 0>
<cfset retVal = throw( "At this time, image.cfc only supports rotating images in 90 degree increments.")>
<cfreturn retVal>
</cfif>
<cfscript>
rotatedImage = CreateObject("java", "java.awt.image.BufferedImage");
at = CreateObject("java", "java.awt.geom.AffineTransform");
op = CreateObject("java", "java.awt.image.AffineTransformOp");
iw = img.getWidth(); h = iw;
ih = img.getHeight(); w = ih;
if(arguments.degrees eq 180) { w = iw; h = ih; }
x = (w/2)-(iw/2);
y = (h/2)-(ih/2);
rotatedImage.init(javacast("int",w),javacast("int",h),img.getType());
at.rotate(arguments.degrees * 0.0174532925,w/2,h/2);
at.translate(x,y);
op.init(at, rh);
op.filter(img, rotatedImage);
if (outputFile eq "")
{
retVal.img = rotatedImage;
return retVal;
} else {
saveImage = writeImage(outputFile, rotatedImage, jpegCompression);
if (saveImage.errorCode gt 0)
{
return saveImage;
} else {
return retVal;
}
}
</cfscript>
</cffunction>
<cffunction name="convert" access="public" output="true" returntype="struct" hint="Convert an image from one format to another.">
<cfargument name="objImage" required="yes" type="Any">
<cfargument name="inputFile" required="yes" type="string">
<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 saveImage = StructNew()>
<cfset var img = "">
<cfset retVal.errorCode = 0>
<cfset retVal.errorMessage = "">
<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>
<cfscript>
if (outputFile eq "")
{
retVal = throw( "The convert method requires a valid output filename.");
return retVal;
} else {
saveImage = writeImage(outputFile, img, jpegCompression);
if (saveImage.errorCode gt 0)
{
return saveImage;
} else {
return retVal;
}
}
</cfscript>
</cffunction>
<cffunction name="setOption" access="public" output="true" returnType="void" hint="Sets values for allowed CFC options.">
<cfargument name="key" type="string" required="yes">
<cfargument name="val" type="string" required="yes">
<cfset var validKeys = "interpolation,textantialiasing,throwonerror,defaultJpegCompression">
<cfset arguments.key = lcase(trim(arguments.key))>
<cfset arguments.val = lcase(trim(arguments.val))>
<cfif listFind(validKeys, arguments.key) gt 0>
<cfset variables[arguments.key] = arguments.val>
</cfif>
</cffunction>
<cffunction name="getOption" access="public" output="true" returnType="any" hint="Returns the current value for the specified CFC option.">
<cfargument name="key" type="string" required="yes">
<cfset var validKeys = "interpolation,textantialiasing,throwonerror,defaultJpegCompression">
<cfset arguments.key = lcase(trim(arguments.key))>
<cfif listFindNoCase(validKeys, arguments.key) gt 0>
<cfreturn variables[arguments.key]>
<cfelse>
<cfreturn "">
</cfif>
</cffunction>
<cffunction name="getRenderingHints" access="private" output="true" returnType="any" hint="Internal method controls various aspects of rendering quality.">
<cfset var rh = CreateObject("java","java.awt.RenderingHints")>
<cfset var initMap = CreateObject("java","java.util.HashMap")>
<cfset initMap.init()>
<cfset rh.init(initMap)>
<cfset rh.put(rh.KEY_ALPHA_INTERPOLATION, rh.VALUE_ALPHA_INTERPOLATION_QUALITY)> <!--- QUALITY, SPEED, DEFAULT --->
<cfset rh.put(rh.KEY_ANTIALIASING, rh.VALUE_ANTIALIAS_ON)> <!--- ON, OFF, DEFAULT --->
<cfset rh.put(rh.KEY_COLOR_RENDERING, rh.VALUE_COLOR_RENDER_QUALITY)> <!--- QUALITY, SPEED, DEFAULT --->
<cfset rh.put(rh.KEY_DITHERING, rh.VALUE_DITHER_DEFAULT)> <!--- DISABLE, ENABLE, DEFAULT --->
<cfset rh.put(rh.KEY_RENDERING, rh.VALUE_RENDER_QUALITY)> <!--- QUALITY, SPEED, DEFAULT --->
<cfset rh.put(rh.KEY_FRACTIONALMETRICS, rh.VALUE_FRACTIONALMETRICS_DEFAULT)> <!--- DISABLE, ENABLE, DEFAULT --->
<cfset rh.put(rh.KEY_STROKE_CONTROL, rh.VALUE_STROKE_DEFAULT)>
<cfif variables.textAntiAliasing>
<cfset rh.put(rh.KEY_TEXT_ANTIALIASING, rh.VALUE_TEXT_ANTIALIAS_ON)>
<cfelse>
<cfset rh.put(rh.KEY_TEXT_ANTIALIASING, rh.VALUE_TEXT_ANTIALIAS_OFF)>
</cfif>
<cfif variables.interpolation eq "nearest_neighbor">
<cfset rh.put(rh.KEY_INTERPOLATION, rh.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)>
<cfelseif variables.interpolation eq "bilinear">
<cfset rh.put(rh.KEY_INTERPOLATION, rh.VALUE_INTERPOLATION_BILINEAR)>
<cfelse>
<cfset rh.put(rh.KEY_INTERPOLATION, rh.VALUE_INTERPOLATION_BICUBIC)>
</cfif>
<cfreturn rh>
</cffunction>
<cffunction name="readImage" access="public" output="true" returntype="struct" hint="Reads an image from a local file. Requires an absolute path.">
<cfargument name="source" required="yes" type="string">
<cfargument name="forModification" required="no" type="boolean" default="yes">
<cfif isURL(source)>
<cfreturn readImageFromURL(source, forModification)>
<cfelse>
<cfreturn readImageFromFile(source, forModification)>
</cfif>
</cffunction>
<cffunction name="readImageFromFile" access="private" output="true" returntype="struct" hint="Reads an image from a local file. Requires an absolute path.">
<cfargument name="inputFile" required="yes" type="string">
<cfargument name="forModification" required="no" type="boolean" default="yes">
<cfset var retVal = StructNew()>
<cfset var img = "">
<cfset var inFile = "">
<cfset var filename = getFileFromPath(inputFile)>
<cfset var extension = lcase(listLast(inputFile,"."))>
<cfset var imageIO = CreateObject("java", "javax.imageio.ImageIO")>
<cfset var validExtensionsToRead = ArrayToList(imageIO.getReaderFormatNames())>
<cfset retVal.errorCode = 0>
<cfset retVal.errorMessage = "">
<cfif not fileExists(arguments.inputFile)>
<cfset retVal = throw("The specified file #Chr(34)##arguments.inputFile##Chr(34)# could not be found.")>
<cfreturn retVal>
<cfelseif listLen(filename,".") lt 2>
<cfset retVal = throw("Sorry, image files without extensions cannot be manipulated.")>
<cfreturn retVal>
<cfelseif listFindNoCase(validExtensionsToRead, extension) is 0>
<cfset retVal = throw("Java is unable to read #extension# files.")>
<cfreturn retVal>
<cfelseif NOT fileExists(arguments.inputFile)>
<cfset retVal = throw("The specified input file does not exist.")>
<cfreturn retVal>
<cfelse>
<cfset img = CreateObject("java", "java.awt.image.BufferedImage")>
<cfset inFile = CreateObject("java", "java.io.File")>
<cfset inFile.init(arguments.inputFile)>
<cfif NOT inFile.canRead()>
<cfset retVal = throw("Unable to open source file #Chr(34)##arguments.inputFile##Chr(34)#.")>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -