使用Coldfusion和Java(类/方法)向文本(大纲)添加笔划

时间:2014-01-19 12:13:03

标签: java coldfusion coldfusion-10

我一直在尝试使用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,这就是为什么我真的很感谢你对这个问题的帮助:)我也尝试转储几乎所有的变量,以便看看隐藏在后面的是什么,可以访问哪些方法/类虽然我无法解决这个问题:((

1 个答案:

答案 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">

enter image description here