当前位置: 首页 > 知识库问答 >
问题:

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

袁旻
2023-03-14

我用C#在屏幕外生成一堆SSRS报告,然后把每个报告的图像粘贴到一个PowerPoint演示文稿中,有效地将所有报告整理成一个包。虽然这样做很好,但对于一个26页的演示文稿,它的文件大小只有23mb。(我明白,使用高dpi在一定程度上导致了这个巨大的数字,但事实证明,这是创建所需清晰度的图像所必需的)。

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

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

我正在以600dpi的速度生成屏幕外的图像。当使用较低的分辨率时,打印时图像质量会下降,字母之间会出现随机模糊伪影(我认为是由于某种形式的抗锯齿)

这导致图像被创建,当粘贴到PowerPoint中时,是一个巨大的121cm x 171cm,缩放比例为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个答案

高兴贤
2023-03-14

吃派。吃派。选一个。;-)

你说你需要高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文件夹中查看预提案.xml。

 类似资料:
  • 问题内容: TL; DR; 上传之前,有没有一种方法可以直接在浏览器端压缩图像(主要是jpeg,png和gif)?我很确定JavaScript可以做到这一点,但是我找不到实现它的方法。 这是我要实现的完整方案: 用户访问我的网站,然后通过元素选择图片, 该图片是通过JavaScript检索的,我们进行了一些验证,例如正确的文件格式,最大文件大小等, 如果一切正常,则会在页面上显示图像的预览, 用户

  • 本文向大家介绍c# 如何实现图片压缩,包括了c# 如何实现图片压缩的使用技巧和注意事项,需要的朋友参考一下 一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图。 一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的

  • 我是JS新手,最近几天我一直在压缩客户端的图像。我想做的是,用户在dropzone上放置一堆图像(可以超过10个),它们应该使用JIC进行压缩,一旦用户点击一个按钮上传所有压缩文件,就会上传到服务器上。 到目前为止,我的代码只能在删除一个图像时压缩和上传,但当我删除多个图像时,所有图像都保持未压缩状态,只有一个图像。我不确定我做错了什么。我试着从这篇文章中找到解决方案,但没能实现我的目标。我使用的

  • 我想上传图像到服务器。将我的图像转换为位图,但仍然出错。位图太大,无法上传到纹理中 如果我得到图片使用画廊意味着我得到错误的位图太大,不能上传到纹理 如果我得到图片使用相机意味着得到错误的 造成:java.lang.安全例外:权限拒绝:阅读<-plhd--1/>MediaProvider uri内容://media/外部/图像/媒体从pid=18253,uid=10257需要android.per

  • 问题内容: 寻找一种将图像压缩为pdf格式并输出pdf进行存档的方法。我无法在创建图像之前对其进行压缩,因为这会影响打印质量。 每个pdf的大小约为8MB,其中大部分由2张图片组成。图片为png格式,并在生成过程中转换为pdf(使用了第三方生成器) 有没有一种方法可以在不使用第3方工具的情况下用Java压缩它们。我尝试使用pdfbox,itext和第3方exe(neevia),第3方工具是迄今为止

  • 问题内容: 我正在使用此示例中的代码从发送一个到我的Web服务器。在这里复制代码 我的问题 如何在将其发送到服务器之前对其进行最佳压缩,以及如何在服务器(我正在使用)上对其进行解压缩? 问题答案: 根据此http://android-developers.blogspot.com/2011/09/androids-http- clients.html 如果您使用的是Gingerbread或更高版本