使用poi实现对图片进行裁剪展示进而实现骑缝章的效果,主要原理就是计算偏移量
代码如下:
XMLSlideShow pptx = new XMLSlideShow(new FileInputStream("F:\temp\office\2013/2013.pptx"));
try {
List list = pptx.getSlideMasters();
for (XSLFSlideMaster master : list) {
XSLFSlideLayout[] layoutArr = master.getSlideLayouts();
for (XSLFSlideLayout layout : layoutArr) {
System.out.println(layout.getName());
}
}
XSLFSlide slide = pptx.getSlides().get(0);
byte[] photoData = FileUtil.getFile("F:/temp/photo/seal.png");
XSLFPictureData pictureData = pptx.addPicture(photoData, PictureType.PNG);
XSLFPictureShape shape = slide.createPicture(pictureData);
Rectangle2D.Double aDouble = new Rectangle2D.Double(0, 0, 85.03935, 170.0787);
shape.setAnchor(aDouble);
CTPicture xmlObject = (CTPicture)shape.getXmlObject();
CTBlipFillProperties blipFill = xmlObject.getBlipFill();
CTRelativeRect ctRelativeRect = blipFill.addNewSrcRect();
ctRelativeRect.setL(50000); // 百分之五十
// ctRelativeRect.setR(300);
FileOutputStream out = new FileOutputStream("F:\temp\office\2013/plain_image.pptx");
pptx.write(out);
out.close();
} finally {
pptx.close();
}
接下来讲述一下两块重点代码:
四个参数分别为: 1.x起始点 2.y起始点 3.图片宽 4.图片高
图片的宽和高单位是pt,一般都是正圆宽和高是一致的,但是由于进行了裁剪,所以要吧宽减少对应的百分比,不然会变扁
原本图片的宽度是6cm,转换为pt为170.0787
假如要裁剪3cm,即裁剪了3/6=50%
所以setL的值就为50000 计算方式为:50 * 1000(至于为啥乘以1000请看计算方式参考)
图片的宽度改为170.0787 * 50% = 85.03935
成品:
实现了类型骑缝章的效果~
计算方式参考:
CTRelativeRect之所以被命名为relative,是因为它的维度是幻灯片高度和幻灯片宽度的百分比。您的长图像将被拉伸或压缩到这些百分比尺寸。另外,所有的左、右、上和下偏移都是以滑动高度和滑动宽度的百分比表示的。
根据您所显示的所需效果,图像应填满整个幻灯片宽度。所以图片宽度将从500px拉长到950px。这是950/500的比率。在相同的比例下,高度也将被拉伸。
了解了这一点,我们需要计算图片尺寸从像素到幻灯片尺寸的百分比。知道了这一点,我们就可以计算顶部偏移量为(100% -图片高度以%为单位)/ 2。如果设置了相同的底部偏移量,那么长图片的正中间将显示在幻灯片背景中。如果顶部偏移量为(100% -图片高度百分比)/ 2) - 100%,底部偏移量为(100% -图片高度百分比)/2+ 100%,则幻灯片背景在长图片的中间下方显示1个幻灯片高度。
除此之外,Microsoft总是将它自己奇怪的度量单位考虑在内。因为避免了百分比的浮点数,所以这里的度量单位是千分之一。



