using UnityEngine; using UnityEngine.UI; namespace HK.FUJIFILM { public static class ImageScaler { /// /// 将Image等比缩放到不超过指定的最大尺寸(宽和高中较大的值不超过maxSize) /// /// 需要缩放的Image组件 /// 宽和高中较大值的最大限制 /// 如果原图比限制小,是否保持原图大小 public static void ScaleImageWithMaxSize(Image image, float maxSize, bool keepOriginalIfSmaller = false) { if (image == null) { Debug.LogError("Image组件不能为空!"); return; } // 获取原始尺寸 float originalWidth, originalHeight; if (image.sprite != null) { // 使用Sprite的原始尺寸 originalWidth = image.sprite.rect.width; originalHeight = image.sprite.rect.height; } else { // 没有Sprite时使用当前RectTransform的尺寸 originalWidth = image.rectTransform.rect.width; originalHeight = image.rectTransform.rect.height; } // 计算缩放比例 float scaleRatio = CalculateScaleRatio(originalWidth, originalHeight, maxSize, keepOriginalIfSmaller); // 应用缩放后的尺寸 image.rectTransform.sizeDelta = new Vector2( originalWidth * scaleRatio, originalHeight * scaleRatio ); } /// /// 计算缩放比例 /// private static float CalculateScaleRatio(float originalWidth, float originalHeight, float maxSize, bool keepOriginalIfSmaller) { // 找到原始宽高中的较大值 float maxOriginal = Mathf.Max(originalWidth, originalHeight); // 如果原图的最大边小于等于限制值,且需要保持原图大小,则不缩放 if (maxOriginal <= maxSize && keepOriginalIfSmaller) { return 1f; // 不缩放 } // 计算缩放比例(让最大边刚好等于maxSize) return maxSize / maxOriginal; } } }