我一直在尝试使用Coldfusion代码和Java类/方法向文本添加笔划。我在Leigh的旧博客(cfsearching)上找到了一些指示,并且花了我很多空闲时间阅读有关Java对象的更多内容,以及如何在Ben Nadel的博客上调用Java类/方法.etc。我有很多需要学习的东西,我很乐意在你的帮助下这样做:)
我把一个测试代码放在一起,这是我到目前为止的
<cfset text = "This is just a text sample">
<cfset img = imageNew("",500,500,"rgb","blue")>
<cfset graphics = ImageGetBufferedImage(img).getGraphics()>
<cfset renderContext = graphics.getFontRenderContext()>
<!---get font details--->
<cfset Font = createObject("java", "java.awt.Font")>
<cfset NewFont = Font.init( "Arial", Font.BOLD, javacast("int", 40))>
<cfset txtLayout = createObject("java", "java.awt.font.TextLayout").init( text,NewFont,renderContext)>
<cfset txtBounds = txtLayout.getBounds()>
<cfset txtWidth = txtBounds.getWidth()>
<cfset txtHeight = txtBounds.getHeight()>
<cfset shapeObj = createObject("java", "java.awt.geom.AffineTransform").init()>
<cfset shape = txtLayout.getOutline(shapeObj)>
<!---set stroke --->
<cfset color = createObject("java", "java.awt.Color")>
<cfset stroke = createObject("java", "java.awt.BasicStroke").init(10)>
<cfset strokeWidth = stroke.getLineWidth()>
<cfset graphics.setStroke( stroke )>
<cfset graphics.setColor( color.decode("##ff0600"))>
<!---write on image--->
<cfset attr = { font="Arial", size="40", style="bold" }>
<cfset x = (ImageGetWidth(img) / 2 - txtWidth / 2)>
<cfset y = (ImageGetHeight(img) / 2 + txtHeight / 2)>
<cfset imageSetDrawingColor(img,"yellow")>
<cfset imageDrawText(img,shape, x, y, attr)>
<cfimage source="#img#" action="writeToBrowser">
我知道我不知何故错误地结合了CF和Java,这就是为什么我真的很感谢你对这个问题的帮助:)我也尝试转储几乎所有的变量,以便看看隐藏在后面的是什么,可以访问哪些方法/类虽然我无法解决这个问题:((
答案 0 :(得分:0)
如果目标是用颜色和来填充文本,那么你真的不能混合两个绘图函数(CF和java)。很难精确匹配定位,所以你经常最终得到一个阴影,而不是一个轮廓。为了获得一致的结果,我会在java中绘制所有文本。
首先获取文本的图形表示:
graphics = ImageGetBufferedImage(img).getGraphics();
context = graphics.getFontRenderContext();
Font = createObject("java", "java.awt.Font");
textFont = Font.init( "Arial", Font.BOLD, javacast("int", 40));
textLayout = createObject("java", "java.awt.font.TextLayout").init( text, textFont, context);
然后计算文本居中的位置。这部分有点违反直觉,但是......基本上你使用AffineTransform设置之前的位置将它绘制到图像上:
transX = (imageWidth/2) - textLayout.getBounds().getWidth()/2;
transY = (imageHeight/2) + textLayout.getDescent();
transform = createObject("java", "java.awt.geom.AffineTransform").init();
transform.setToTranslation( transX, transY );
接下来,获取文本形状,并用您想要的任何背景颜色填充它:
// fill it with a "yellow" background
shape = textLayout.getOutline(transform);
color = createObject("java", "java.awt.Color");
graphics.setColor( color.decode("##ffff00") );
graphics.fill( shape );
最后,绘制文字大纲:
// finally, draw a "red" outline
graphics.setColor( color.decode("##ff0600"));
stroke = createObject("java", "java.awt.BasicStroke").init(1);
graphics.setStroke( stroke );
graphics.draw( shape );
然后照常显示图像:
<cfimage source="#img#" action="writeToBrowser">