我正在使用本教程here
生成一个ppt文件步骤4介绍了如何换出图像占位符。 我的图像有不同的尺寸,这使得一些图像看起来有点太有趣了。
有没有办法调整占位符的大小以便它可以保留尺寸?
编辑:好的,更好的解释:用户可以上传自己的图像。图像存储在服务器上。我正在生成一个ppt文件,每个幻灯片有一个用户。对于每张幻灯片,都会有一张图片,如果有的话。我当然可以得到每个图像的尺寸,但是如何用占位符替换另一个维度的图像呢?
答案 0 :(得分:4)
好吧,我不能根据该教程告诉你,但我可以告诉你它在Open XML中的位置(即不是SDK)。
您的图片将包含一个xfrm
元素,其中包含一组值,如下所示:
<p:spPr>
<a:xfrm>
<a:off x="7048050" y="6248401"/>
<a:ext cx="972000" cy="288000"/>
</a:xfrm>
</p:spPr>
您要更改的值是cx
的{{1}}和cy
。从a:ext
对象中获取新图片的尺寸(h和w)并获取每个值并乘以12700.因此,如果图片的宽度为400像素,则System.Drawing.Image
的值为cx
{1}}将是(400 x 12700 = 5080000)。
答案 1 :(得分:0)
我是这样做的:
using DocumentFormat.OpenXml.Packaging;
假设您有 SlidePart
就我而言,我想检查图片的 alt 标题,如果与我的密钥匹配,则替换它们。
//find all image alt title (description) in the slide
List<DocumentFormat.OpenXml.Presentation.Picture> slidePictures = slidePart.Slide.Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
.Where(a => a.NonVisualPictureProperties.NonVisualDrawingProperties.Description.HasValue).Distinct().ToList();
现在我们检查所有图像:
//check all images in the slide and replace them if it matches our parameter
foreach (DocumentFormat.OpenXml.Presentation.Picture imagePlaceHolder in slidePictures)
现在在循环中我们寻找 Transform2D
并用我们的值修改它:
Transform2D transform = imagePlaceHolder.Descendants<Transform2D>().First();
Tuple<Int64Value, Int64Value> aspectRatio = CorrectAspectRatio(param.Image.FullName, transform.Extents.Cx, transform.Extents.Cy);
transform.Extents.Cx = aspectRatio.Item1;
transform.Extents.Cy = aspectRatio.Item2;
这个函数看起来像这样:
public static Tuple<Int64Value, Int64Value> CorrectAspectRatio(string fileName, Int64Value cx, Int64Value cy)
{
BitmapImage img = new();
using (FileStream fs = new(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
img.BeginInit();
img.StreamSource = fs;
img.EndInit();
}
int widthPx = img.PixelWidth;
int heightPx = img.PixelHeight;
const int EMUsPerInch = 914400;
Int64Value x = (Int64Value)(widthPx * EMUsPerInch / img.DpiX);
Int64Value y = (Int64Value)(heightPx * EMUsPerInch / img.DpiY);
if (x > cx)
{
decimal ratio = cx * 1.0m / x;
x = cx;
y = (Int64Value)(cy * ratio);
}
if (y > cy)
{
decimal ratio = cy * 1.0m / y;
y = cy;
x = (Int64Value)(cx * ratio);
}
return new Tuple<Int64Value, Int64Value>(x, y);
}
需要注意的重要一点是 EMU per inch
是 914400
。在大多数情况下,您只需将其除以 96
,但对于某些监视器,情况有所不同。因此,最好将其划分为 DPI
和 x
的 y
。