ReadImageUri
(
ExcelTableReader.ExcelTableRow oRow,
IVertex oVertex,
VertexRadiusConverter oVertexRadiusConverter,
Nullable<Single> oVertexImageSize
)
{
Debug.Assert(oRow != null);
Debug.Assert(oVertex != null);
Debug.Assert(oVertexRadiusConverter != null);
AssertValid();
String sImageUri;
if ( !oRow.TryGetNonEmptyStringFromCell(
VertexTableColumnNames.ImageUri, out sImageUri) )
{
return (false);
}
if ( sImageUri.ToLower().StartsWith("www.") )
{
// The Uri class thinks that "www.somewhere.com" is a relative
// path. Fix that.
sImageUri= "http://" + sImageUri;
}
Uri oUri;
// Is the URI either an URL or a full file path?
if ( !Uri.TryCreate(sImageUri, UriKind.Absolute, out oUri) )
{
// No. It appears to be a relative path.
Range oCell = oRow.GetRangeForCell(
VertexTableColumnNames.ImageUri);
String sWorkbookPath =
( (Workbook)(oCell.Worksheet.Parent) ).Path;
if ( !String.IsNullOrEmpty(sWorkbookPath) )
{
sImageUri = Path.Combine(sWorkbookPath, sImageUri);
}
else
{
OnWorkbookFormatError( String.Format(
"The image file path specified in cell {0} is a relative"
+ " path. Relative paths must be relative to the saved"
+ " workbook file, but the workbook hasn't been saved yet."
+ " Either save the workbook or change the image file to"
+ " an absolute path, such as \"C:\\MyImages\\Image.jpg\"."
,
ExcelUtil.GetRangeAddress(oCell)
),
oCell
);
}
}
// Note that sImageUri may or may not be a valid URI string. If it is
// not, GetImageSynchronousIgnoreDpi() will return an error image.
ImageSource oImage =
( new WpfImageUtil() ).GetImageSynchronousIgnoreDpi(sImageUri);
if (oVertexImageSize.HasValue)
{
// Resize the image.
Double dLongerDimension =
oVertexRadiusConverter.WorkbookToLongerImageDimension(
oVertexImageSize.Value);
Debug.Assert(dLongerDimension >= 1);
oImage = ( new WpfImageUtil() ).ResizeImage(oImage,
(Int32)dLongerDimension);
}
oVertex.SetValue(ReservedMetadataKeys.PerVertexImage, oImage);
return (true);
}