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

Reply via email to