1

我正在使用 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();
  }
}
4

1 回答 1

0

吃馅饼。吃馅饼。选一个。;-)

你是说你需要高 DPI 图像来保持质量。然后你问如何让 PowerPoint 降低 DPI。

您的问题尚不清楚,但听起来您可能对图像的初始分辨率有一些控制。如果是这样,为什么不在将它们插入 PowerPoint 之前以所需的 DPI 生成它们呢?

如果这不切实际,您可以设置一些注册表项来覆盖 PowerPoint 的默认压缩。请注意,您必须在启动 PowerPoint 之前进行 reg 更改,否则它们将无效。

这解释了如何打开/关闭默认压缩:PowerPoint 2007 和 2010 使图片模糊,丢失 GIF 动画 http://www.pptfaq.com/FAQ00862_PowerPoint_2007_and_2010_make_pictures_blurry-_loses_GIF_animation.htm

每个演示文稿都存储压缩 DPI 和是否丢弃图像数据。破解一个 PPTX 打开并查看 PPTX/ZIP 文件中 ppt 文件夹中的 presProps.xml。

于 2013-04-23T15:06:03.130 回答