Chris Hays's Reporting Services Sleazy Hacks Weblog

Centered Images

Question:
I have variable sized images I want to display in a table column.  How can I center these images without stretching them to fill the table cell?

Answer:
While there is no automatic centering behavior for the Image control, you can simulate this by writing an expression for PaddingLeft and PaddingTop to result in a centered image.

Step 1:  Clip, don't Fit

Set the Sizing property of the Image control to Clip.  In a table cell, this is the only setting that won't resize your image.  (If your image gets automatically resized, the calculations below won't work.)

Step 2:  Give yourself room to grow

Make your column and row large enough to accomodate your largest image so that the image won't clip.

Step 3:  Turn off CanGrow

For all other cells in the row, turn off CanGrow, so ensure long textual contents won't cause the row to increase in size (thereby invalidating the calculations below).

Step 4:  Reference System.Drawing

To determine the size of the image, you'll need to add a reference to the System.Drawing assembly in your report.  This is in the Report Properties dialog on the References Tab.

Step 5:  Calculate padding

To determine the size of the image, you'll need to load the image from your field into a memory stream and from there load it into a .Net Image object.  Since fields are of type Object, you'll need to cast it to a byte array before loading it into a memory stream.

ImageWidthInPixels = System.Drawing.Image.FromStream(new System.IO.MemoryStream(CType(Fields!Photo.Value,Byte()))).Width

From there, you can calculate the half of the difference between the width of the image and the width of the column.

Padding = (ColumnWidthInInches-ImageWidthInPixels/DPI)/2

DPI is typically 96

The padding property takes a size, which is a string including the size and the units.

PaddingLeft = CStr(Round(Padding,2)) & "in"

Here's the expression fully expanded:

=CStr(Round((3-System.Drawing.Image.FromStream(new System.IO.MemoryStream(CType(Fields!Photo.Value,Byte()))).Height/96)/2,2))&"in"

Now just do the same thing for PaddingTop and you've got a fully centered image.

A full working sample of centered images is attached.

 

Published Wednesday, October 27, 2004 12:38 PM by ChrisHays
Filed under:

Attachment(s): CenterImage.rdl
Anonymous comments are disabled

This Blog

Syndication

News

This blog is provided 'AS IS' with no warranties, and confers no rights. All rights reserved. Some assembly required. Batteries not included. Your mileage may vary. Objects in mirror may be closer than they appear. No user serviceable parts inside. Opening cover voids warranty. Keep out of reach of children under 3.

© 2008 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker