我正在使用 C# 在屏幕外生成一堆 SSRS 报告,然后为每个报告获取创建的图像并将它们粘贴到 PowerPoint 演示文稿中,有效地将所有报告整理到一个包中。虽然这很好用,但它会产生 23mb 的文件大小,仅用于 26 页的演示文稿。(我知道使用高 dpi 部分导致了这个怪物数量,但事实证明这是创建所需清晰度的图像所必需的)。
但是,当我在 PowerPoint 中手动保存此演示文稿时,文件大小会减小到大约 13mb。(这是压缩图片选项目标输出设置为 96dpi)。有没有办法可以命令 Powerpoint 从我的代码中以较低的分辨率保存所有图像,以便生成的文件更小?
.Save()
(目前,在我的整个过程中,文件仅在被 SlidePart命令调用时被保存。)
更多信息
我正在以 600dpi 的屏幕外生成图像。当使用较低的分辨率时,打印时图像质量会下降,并且字母之间开始出现随机模糊伪影(我假设是由于某种形式的抗锯齿)
这会导致创建的图像在粘贴到 PowerPoint 时为 121 厘米 x 171 厘米,缩放比例为 16%。但是,一旦我在 PowerPoint 中查看此演示文稿并随后保存它,它会将图像大小缩小到 100% 比例的幻灯片大小,而不会降低质量。
我想问题是,我怎样才能指示我的程序执行这种调整大小的转换?我正在使用的代码如下
private void ReplaceSlideImage(SlidePart slidePart, byte[] imageData, int imageWidth, int imageHeight, ImagePartType imageType)
{
// The ratio of the image size to the slide size
// Set to 1.0 to make the image fill the slide, or < 1.0 to leave a border
const double IMAGE_SCALE_FACTOR = 1.0;
Slide theSlide = slidePart.Slide;
double slideAspectRatio = 0.0;
double imageAspectRatio = 0.0;
System.IO.MemoryStream imageStream = null;
// Look for the first embedded image on the slide.
Drawing.Blip blip = theSlide.Descendants<Drawing.Blip>().FirstOrDefault();
if (blip != null)
{
// Add the new image part.
ImagePart newImagePart = slidePart.AddImagePart(imageType);
imageStream = new MemoryStream(imageData);
newImagePart.FeedData(imageStream);
blip.Embed = slidePart.GetIdOfPart(newImagePart);
// Scale the image to fit the slide
SlideSize slideSize = m_file.PresentationPart.Presentation.Descendants<SlideSize>().First();
Transform2D imageTransform = slidePart.Slide.Descendants<Transform2D>().First();
slideAspectRatio = (double)slideSize.Cx / (double)slideSize.Cy;
imageAspectRatio = (double)imageWidth / (double)imageHeight;
if (imageAspectRatio > slideAspectRatio)
{
imageTransform.Extents.Cx = (Int64)(slideSize.Cx * IMAGE_SCALE_FACTOR);
imageTransform.Extents.Cy = (Int64)(slideSize.Cx * IMAGE_SCALE_FACTOR / imageAspectRatio);
}
else
{
imageTransform.Extents.Cy = (Int64)(slideSize.Cy * IMAGE_SCALE_FACTOR);
imageTransform.Extents.Cx = (Int64)(slideSize.Cy * IMAGE_SCALE_FACTOR * imageAspectRatio);
}
// Recentre the image to the middle of the slide
imageTransform.Offset.X = (slideSize.Cx / 2) - (imageTransform.Extents.Cx / 2);
imageTransform.Offset.Y = (slideSize.Cy / 2) - (imageTransform.Extents.Cy / 2);
theSlide.Save();
// Dispose of the image stream
imageStream.Dispose();
}
}