Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 1x 224x 32x 32x 32x 32x 32x 32x 32x 32x 32x | import type { ImageMetadataFormat } from 'roosterjs-content-model-types';
import type { GeneratedImageSize } from '../types/GeneratedImageSize';
/**
* @internal
* Calculate the target size of an image.
* For image that is not rotated, target size is the same with resizing/cropping size.
* For image that is rotated, target size is calculated from resizing/cropping size and its rotate angle
* Say an image is resized to 100w*100h, cropped 25% on each side, then rotated 45deg, so that cropped size
* will be (both height and width) 100*(1-0.25-0,25) = 50px, then final image size will be 50*sqrt(2) = 71px
* @param editInfo The edit info to calculate size from
* @param beforeCrop True to calculate the full size of original image before crop, false to calculate the size
* after crop
* @returns A GeneratedImageSize object which contains original, visible and target target width and height of the image
*/
export function getGeneratedImageSize(
editInfo: ImageMetadataFormat,
beforeCrop?: boolean
): GeneratedImageSize | undefined {
const {
widthPx: width,
heightPx: height,
angleRad,
leftPercent: left,
rightPercent: right,
topPercent: top,
bottomPercent: bottom,
} = editInfo;
Iif (
height == undefined ||
width == undefined ||
left == undefined ||
right == undefined ||
top == undefined ||
bottom == undefined
) {
return;
}
const angle = angleRad ?? 0;
// Original image size before crop and rotate
const originalWidth = width / (1 - left - right);
const originalHeight = height / (1 - top - bottom);
// Visible size
const visibleWidth = beforeCrop ? originalWidth : width;
const visibleHeight = beforeCrop ? originalHeight : height;
// Target size after crop and rotate
const targetWidth =
Math.abs(visibleWidth * Math.cos(angle)) + Math.abs(visibleHeight * Math.sin(angle));
const targetHeight =
Math.abs(visibleWidth * Math.sin(angle)) + Math.abs(visibleHeight * Math.cos(angle));
return {
targetWidth,
targetHeight,
originalWidth,
originalHeight,
visibleWidth,
visibleHeight,
};
}
|