如何通过C#压缩PowerPoint中的图像?

时间:2013-04-23 14:10:41

标签: c# reporting-services powerpoint

我使用C#在屏幕外生成一堆SSRS报告,然后为每个报告获取创建的图像并将其粘贴到PowerPoint演示文稿中,有效地将所有报告整理到一个包中。虽然这样可以正常工作,但它的文件大小为23mb,只有26页的演示文稿。 (我强调,使用高dpi部分导致了这个怪物数字,但事实证明有必要创建一个所需清晰度的图像)。

但是,当我在PowerPoint中手动保存此演示文稿时,文件大小会减少到大约13mb。 (这是将压缩图片选项Target输出设置为96dpi)。有没有办法可以命令Powerpoint从我的代码中以较低的分辨率保存所有图像,以便生成的文件更小?

(目前,在我的整个过程中,仅在通过SlidePart .Save()命令调用时才会保存文件。)

更多信息

我在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();
  }
}

1 个答案:

答案 0 :(得分:0)

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

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

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

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

这解释了如何打开/关闭默认压缩: 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。