我正在使用Visual Studio 2008(C#)中的Crystal Reports对象。该报告正在建设正常,数据正确绑定。但是,当我尝试从源中调整IBlobFieldObject的大小时,比例会变得不正确。
关于这种情况的两点说明。源图像为1024x768,我的最大宽度和高度为720x576。我的数学应该是正确的,我的新图像尺寸将是720x540(以适应最大宽度和高度指南)。我这样做的比例是错误的:
img = Image.FromFile(path);
newWidth = img.Size.Width;
newHeight = img.Size.Height;
if ((img.Size.Width > 720) || (img.Size.Height > 576))
{
double ratio = Convert.ToDouble(img.Size.Width) / Convert.ToDouble(img.Size.Height);
if (ratio > 1.25) // Adjust width to 720, height will fall within range
{
newWidth = 720;
newHeight = Convert.ToInt32(Convert.ToDouble(img.Size.Height) * 720.0 / Convert.ToDouble(img.Size.Width));
}
else // Adjust height to 576, width will fall within range
{
newHeight = 576;
newWidth = Convert.ToInt32(Convert.ToDouble(img.Size.Width) * 576.0 / Convert.ToDouble(img.Size.Height));
}
imgRpt.Section3.ReportObjects["image"].Height = newHeight;
imgRpt.Section3.ReportObjects["image"].Width = newWidth;
}
我已经逐步完成了代码,以确保数学中的值是正确的,我甚至保存了图像文件,以确保宽高比正确(它是)。无论我尝试什么,图像都被压扁 - 几乎就像Crystal Reports设计器中的Scale值关闭一样(它们不是)。在此先感谢您的帮助!
答案 0 :(得分:2)
Crystal Reports处理IBlobFieldObjects的方式存在一些问题。我遇到的第一个问题是内联文档对于Crystal Reports的ReportObjects的高度和宽度属性是不正确的。它表示值是以缇为单位表示的,但它们并非如此。例如:
ImageReport imgRpt = new ImageReport();
// The following value should be in PIXELS... NOT twips as the docs suggest!
imgRpt.Section3.ReportObjects["image"].Height = 300;
第二个问题与我正在进行的imageToByteArray转换有关。这是我使用的方法:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
// The following line was ImageFormat.Jpeg, but it caused sizing issues
// in Crystal Reports. Changing to ImageFormat.Bmp made the squashed
// problems go away.
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
return ms.ToArray();
}
总之,Crystal Reports似乎更喜欢ImageFormat.Bmp来填充IBlobFieldObjects。现在,如果有人能告诉我如何修复使用ImageFormat.Bmp的可怕深度(它很可能是Crystal Reports Report对象处理图像数据的方式,并且可能无法修复),我将全部设置。