To center the text vertically, you could try something like this. Doing the
drawing with CF makes it a little convoluted. But it should work okay
BTW: I was not sure what you meant by offset. As that would imply something
other than centered .. ?
<cfscript>
// initialize the text properties
Font = CreateObject("java", "java.awt.Font");
prop = { string = "Sheehan Funeral Home Sheehan Funeral Home Sheehan
Funeral Home Sheehan Funeral Home",
font="Georgia",
style="bolditalic",
javaStyle=BitOr(FONT.BOLD,
Font.ITALIC),
size=24
};
// create sample image. used for measuring text only
img = ImageNew("", 10, 10, "rgb", "lightgray");
graphics = ImageGetBufferedImage( img ).getGraphics();
// create font used to draw the text
currentFont = Font.init( javacast("string", prop.font),
javacast("int",
prop.javaStyle),
javacast("int",
prop.size)
);
// get text measurements using font metrics
graphics.setFont( currentFont );
fontMetrics = graphics.getFontMetrics( );
//fontMetrics = graphics.getFontMetrics( currentFont );
fontBounds = fontMetrics.getStringBounds( javacast("string", prop.string),
graphics );
// save dimensions
dimensions = { width = fontBounds.getWidth(),
height = fontBounds.getHeight(),
leading = fontMetrics.getLeading(),
ascent = fontMetrics.getAscent(),
descent = fontMetrics.getDescent()
};
// prepare to draw text on new image
img = ImageNew("", dimensions.Width+20, dimensions.height+10, "rgb",
"lightgray");
ImageSetDrawingColor( img, "black" );
// center text horizontally
dimensions.xOffset = (img.width - dimensions.width) / 2;
// center text vertically (This includes any leading value!)
dimensions.yOffset = (img.height - dimensions.height) / 2 +
dimensions.ascent;
ImageDrawText( img, prop.string, dimensions.xOffset, dimensions.yOffset ,
prop );
// draw a rectangle indicatating the font bounds
dimensions.boxXPos = (img.width - dimensions.width) / 2;
dimensions.boxYPos = (img.height - dimensions.height) / 2;
Color = createObject("java", "java.awt.Color");
// must retrieve the underlying graphics object from the new image first
graphics = ImageGetBufferedImage( img ).getGraphics();
graphics.setColor(Color.RED);
graphics.drawRect( javacast("int", dimensions.boxXPos),
javacast("int", dimensions.boxYPos),
dimensions.width,
dimensions.height
);
// draw a line indicating baseline (approximate)
dimensions.baseLineY = ((img.height - dimensions.height) / 2) +
dimensions.ascent;
graphics.setColor(Color.ORANGE);
graphics.drawLine( javacast("int", 0),
javacast("int", dimensions.baseLineY),
img.width,
javacast("int", dimensions.baseLineY)
);
// draw a line indicating vertical center (approximate)
dimensions.verticalCenter = img.height / 2;
graphics.setColor(Color.MAGENTA);
graphics.drawLine( javacast("int", 0),
javacast("int",
dimensions.verticalCenter),
img.width,
javacast("int", dimensions.verticalCenter)
);
graphics.dispose();
</cfscript>
<cfimage action="writeToBrowser" source="#img#">
<cfdump var="#dimensions#" label="FontMetrics">
<cfscript>
// get the text measurements using text layout
graphics = ImageGetBufferedImage( img ).getGraphics();
graphics.setFont( currentFont );
context = graphics.getFontRenderContext();
TextLayout = createObject("java", "java.awt.font.TextLayout");
layout = TextLayout.init( prop.string, currentFont, context );
layoutBounds = layout.getBounds();
// save dimensions. some fonts may extend above the ascent
dimensions = { width = layoutBounds.getWidth(),
height = layoutBounds.getHeight(),
leading = layout.getLeading(),
ascent = layout.getAscent(),
descent = layout.getDescent()
};
dimensions.boxXPos = (img.width - dimensions.width) / 2;
dimensions.boxYPos = (img.height - ceiling(dimensions.height)) / 2;
// draw a rectangle to indicating the layout bounds
Color = createObject("java", "java.awt.Color");
graphics.setColor( Color.BLUE );
graphics.drawRect( javacast("int", dimensions.boxXPos),
javacast("int", dimensions.boxYPos),
dimensions.width,
dimensions.height
);
graphics.dispose();
</cfscript>
<cfimage action="writeToBrowser" source="#img#">
<cfdump var="#dimensions#" label="Text Layout">
<cfabort>
<cfscript>
// create a new image
img = ImageNew("", dimensions.width+20, dimensions.height+10, "rgb",
"lightgray");
ImageSetDrawingColor( img, "black" );
// get the text measurements using text layout
graphics = ImageGetBufferedImage( img ).getGraphics();
graphics.setFont( currentFont );
context = graphics.getFontRenderContext();
TextLayout = createObject("java", "java.awt.font.TextLayout");
layout = TextLayout.init( prop.string, currentFont, context );
layoutBounds = layout.getBounds();
graphics.setColor( Color.BLACK );
// save dimensions. some fonts may extend above the ascent
dimensions = { width = layoutBounds.getWidth(),
height = layoutBounds.getHeight(),
leading = layout.getLeading(),
ascent = layout.getAscent(),
descent = layout.getDescent()
};
x = (img.width - layout.getVisibleAdvance()) / 2;
y = ((img.height - layoutBounds.getHeight()) / 2) + layout.getAscent();
layout.draw(graphics, javacast("float", x), javacast("float", y));
// draw a rectangle to indicating the layout bounds
layoutBounds.setRect( layoutBounds.getX() + x,
layoutBounds.getY()+ y,
layoutBounds.getWidth(),
layoutBounds.getHeight()
);
graphics.setColor( Color.BLUE );
graphics.draw(layoutBounds);
graphics.dispose();
</cfscript>
<cfimage action="writeToBrowser" source="#img#">
<cfdump var="#dimensions#" label="Text Layout">
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Order the Adobe Coldfusion Anthology now!
http://www.amazon.com/Adobe-Coldfusion-Anthology-Michael-Dinowitz/dp/1430272155/?tag=houseoffusion
Archive:
http://www.houseoffusion.com/groups/cf-talk/message.cfm/messageid:337076
Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm
Unsubscribe: http://www.houseoffusion.com/groups/cf-talk/unsubscribe.cfm