⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image.cfc

📁 开源的HTML文本编辑器
💻 CFC
📖 第 1 页 / 共 4 页
字号:

		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 + -