public static PowerPoint.ShapeRange Crop(PowerPoint.ShapeRange shapeRange, float aspectRatio) { bool hasChange = false; for (int i = 1; i <= shapeRange.Count; i++) { PowerPoint.ShapeRange origShape = shapeRange[i].Duplicate(); origShape.ScaleWidth(1, Office.MsoTriState.msoTrue); origShape.ScaleHeight(1, Office.MsoTriState.msoTrue); float origWidth = origShape.Width; float origHeight = origShape.Height; origShape.Delete(); float currentWidth = shapeRange[i].Width - (shapeRange[i].PictureFormat.CropLeft + shapeRange[i].PictureFormat.CropRight) / origWidth; float currentHeight = shapeRange[i].Height - (shapeRange[i].PictureFormat.CropTop + shapeRange[i].PictureFormat.CropBottom) / origHeight; float currentProportions = currentWidth / currentHeight; if (IsApproximatelyEquals(currentProportions, aspectRatio)) { continue; } else if (currentProportions > aspectRatio) { // Crop the width float desiredWidth = currentHeight * aspectRatio; float widthToCrop = origWidth * ((currentWidth - desiredWidth) / currentWidth); CropHorizontal(shapeRange[i], widthToCrop); hasChange = true; } else if (currentProportions < aspectRatio) { // Crop the height float desiredHeight = currentWidth / aspectRatio; float heightToCrop = origHeight * ((currentHeight - desiredHeight) / currentHeight); CropVertical(shapeRange[i], heightToCrop); hasChange = true; } } if (!hasChange) { throw new CropLabException(CropLabErrorHandler.ErrorCodeNoAspectRatioCropped.ToString()); } return(shapeRange); }
public static PowerPoint.ShapeRange Crop(PowerPoint.ShapeRange shapeRange) { bool hasChange = false; for (int i = 1; i <= shapeRange.Count; i++) { PowerPoint.Shape shape = shapeRange[i]; // Store initial properties float currentRotation = shape.Rotation; float cropLeft = shape.PictureFormat.CropLeft; float cropRight = shape.PictureFormat.CropRight; float cropTop = shape.PictureFormat.CropTop; float cropBottom = shape.PictureFormat.CropBottom; // Set properties to zero to do proper calculations shape.PictureFormat.CropLeft = 0; shape.PictureFormat.CropRight = 0; shape.PictureFormat.CropTop = 0; shape.PictureFormat.CropBottom = 0; shape.Rotation = 0; // Get unscaled dimensions PowerPoint.ShapeRange origShape = shape.Duplicate(); origShape.ScaleWidth(1, Office.MsoTriState.msoTrue); origShape.ScaleHeight(1, Office.MsoTriState.msoTrue); float origWidth = origShape.Width; float origHeight = origShape.Height; origShape.SafeDelete(); Rectangle origImageRect = new Rectangle(); Rectangle croppedImageRect = new Rectangle(); Utils.GraphicsUtil.ExportShape(shape, TempPngFileExportPath); using (Bitmap shapeBitmap = new Bitmap(TempPngFileExportPath)) { origImageRect = new Rectangle(0, 0, shapeBitmap.Width, shapeBitmap.Height); try { croppedImageRect = GetImageBoundingRect(shapeBitmap, shape.Name); } catch (NotSupportedException e) { throw e; } } float cropRatioLeft = croppedImageRect.Left / (float)origImageRect.Width; float cropRatioRight = (origImageRect.Width - croppedImageRect.Width) / (float)origImageRect.Width; float cropRatioTop = croppedImageRect.Top / (float)origImageRect.Height; float cropRatioBottom = (origImageRect.Height - croppedImageRect.Height) / (float)origImageRect.Height; float newCropLeft = Math.Max(origWidth * cropRatioLeft, cropLeft); float newCropRight = Math.Max(origWidth * cropRatioRight, cropRight); float newCropTop = Math.Max(origHeight * cropRatioTop, cropTop); float newCropBottom = Math.Max(origHeight * cropRatioBottom, cropBottom); if (!hasChange && (!IsApproximatelySame(newCropLeft, cropLeft) || !IsApproximatelySame(newCropRight, cropRight) || !IsApproximatelySame(newCropTop, cropTop) || !IsApproximatelySame(newCropBottom, cropBottom))) { hasChange = true; } shape.Rotation = currentRotation; shape.PictureFormat.CropLeft = newCropLeft; shape.PictureFormat.CropRight = newCropRight; shape.PictureFormat.CropTop = newCropTop; shape.PictureFormat.CropBottom = newCropBottom; } if (!hasChange) { throw new CropLabException(CropLabErrorHandler.ErrorCodeNoPaddingCropped.ToString()); } return(shapeRange); }