Пример #1
0
        public static UILabel AddLabel(UIView view, string text, UIColor color, ResizeAlignment alignment, UIEdgeInsets margins)
        {
            var label = new UILabel {
                Text      = text,
                TextColor = color
            };

            return(AddLabel(view, label, alignment, margins));
        }
Пример #2
0
 public static UIImage ResizeAndDispose(
     this UIImage image,
     CGSize requestedSize,
     ResizeMethod resizeStrategy     = ResizeMethod.Stretch,
     ResizeAlignment resizeAlignment = ResizeAlignment.CenterCenter,
     bool antiAliasing = true,
     CGInterpolationQuality interpolationQuality = CGInterpolationQuality.High,
     UIColor paddingColor = null)
 {
     return(Tools.iOSTool.ResizeAndDispose(image, requestedSize, resizeStrategy, resizeAlignment, antiAliasing, interpolationQuality, paddingColor));
 }
Пример #3
0
 public static Bitmap ResizeAndDispose(
     this Image image,
     Size requestedSize,
     ResizeMethod resizeMethod           = ResizeMethod.Stretch,
     ResizeAlignment resizeAlignment     = ResizeAlignment.CenterCenter,
     InterpolationMode interpolationMode = InterpolationMode.HighQualityBicubic,
     Color?paddingColor         = null,
     PixelFormat?newPixelFormat = null
     )
 {
     using (var sourceImage = image) {
         return(sourceImage.Resize(requestedSize, resizeMethod, resizeAlignment, interpolationMode,
                                   paddingColor, newPixelFormat));
     }
 }
Пример #4
0
        public static Bitmap FocusZoom(this Image image, float zoomFactor, int focusX, int focusY,
                                       ResizeMethod resizeMethod           = ResizeMethod.Stretch,
                                       ResizeAlignment resizeAlignment     = ResizeAlignment.CenterCenter,
                                       InterpolationMode interpolationMode = InterpolationMode.HighQualityBicubic,
                                       Color?paddingColor         = null,
                                       PixelFormat?newPixelFormat = null
                                       )
        {
            if (Math.Abs(zoomFactor - 0.0f) < Tools.Maths.EPSILON_F)
            {
                throw new ArgumentOutOfRangeException("zoomFactor", string.Format("Must not be 0 (epsilon tested with {0})", Tools.Maths.EPSILON_F));
            }

            var actualPaddingColor = paddingColor.GetValueOrDefault(Color.Transparent);
            var pixelFormat        = newPixelFormat.GetValueOrDefault(image.PixelFormat);

            var bitmap = new Bitmap(image.Width, image.Height, pixelFormat);

            bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);

            using (Graphics graphics = Graphics.FromImage(bitmap)) {
                graphics.Clear(actualPaddingColor);
                graphics.InterpolationMode = interpolationMode;

                var sourceHeight = image.Height / zoomFactor;
                var sourceWidth  = image.Width / zoomFactor;
                var startX       = focusX - sourceWidth / 2;
                var startY       = focusY - sourceHeight / 2;

                var sourceRectangle = new Rectangle(
                    (int)Math.Round(startX),
                    (int)Math.Round(startY),
                    (int)Math.Round(sourceWidth),
                    (int)Math.Round(sourceHeight)
                    )
                                      .IntersectWith(0, 0, image.Width, image.Height);

                var destRectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height);

                graphics.DrawImage(image, sourceRectangle, destRectangle, GraphicsUnit.Pixel);
            }
            return(bitmap);
        }
Пример #5
0
        public static UIImage Resize(
            UIImage sourceImage,
            CGSize requestedSize,
            ResizeMethod resizeMethod       = ResizeMethod.Stretch,
            ResizeAlignment resizeAlignment = ResizeAlignment.CenterCenter,
            bool antiAliasing = true,
            CGInterpolationQuality interpolationQuality = CGInterpolationQuality.High,
            UIColor paddingColor = null)
        {
            if (paddingColor == null)
            {
                paddingColor = UIColor.Clear;
            }

            var    sourceImageSize = (CGSize)sourceImage.Size;
            var    scaleWidth      = ((float)requestedSize.Width / (float)sourceImageSize.Width);
            var    scaleHeight     = ((float)requestedSize.Height / (float)sourceImageSize.Height);
            CGSize destImageSize;
            CGRect sourceBlitRect      = CGRect.Empty;
            CGRect destBlitRect        = CGRect.Empty;
            bool   alignSourceBlitRect = false;
            bool   alignDestBlitRect   = false;

            switch (resizeMethod)
            {
            case ResizeMethod.AspectFit:
                sourceBlitRect      = new CGRect(CGPoint.Empty, sourceImageSize);
                scaleWidth          = Math.Min(scaleWidth, scaleHeight);
                scaleHeight         = Math.Min(scaleWidth, scaleHeight);
                destBlitRect.Width  = sourceImageSize.Width * scaleWidth;
                destBlitRect.Height = sourceImageSize.Height * scaleHeight;
                destImageSize       = destBlitRect.Size;

                break;

            case ResizeMethod.AspectFitPadded:
                sourceBlitRect      = new CGRect(CGPoint.Empty, sourceImageSize);
                scaleWidth          = Math.Min(scaleWidth, scaleHeight);
                scaleHeight         = Math.Min(scaleWidth, scaleHeight);
                destBlitRect.Width  = sourceImageSize.Width * scaleWidth;
                destBlitRect.Height = sourceImageSize.Height * scaleHeight;
                destImageSize       = requestedSize;
                alignDestBlitRect   = true;
                break;

            case ResizeMethod.AspectFill:
                var sourceAspect = sourceImageSize.Width / sourceImageSize.Height;
                var destAspect   = requestedSize.Width / requestedSize.Height;
                if (destAspect > sourceAspect)
                {
                    sourceBlitRect      = new CGRect(0, 0, sourceImageSize.Width, sourceImageSize.Width / destAspect);
                    alignSourceBlitRect = true;
                }
                else if (destAspect < sourceAspect)
                {
                    sourceBlitRect      = new CGRect(0, 0, sourceImageSize.Height * destAspect, sourceImageSize.Height);
                    alignSourceBlitRect = true;
                }
                else
                {
                    sourceBlitRect = new CGRect(CGPoint.Empty, sourceImageSize);
                }
                destBlitRect  = new CGRect(CGPoint.Empty, requestedSize);
                destImageSize = requestedSize;
                break;

            case ResizeMethod.Stretch:
            default:
                sourceBlitRect      = new CGRect(CGPoint.Empty, sourceImageSize);
                destBlitRect.Width  = sourceImageSize.Width * scaleWidth;
                destBlitRect.Height = sourceImageSize.Height * scaleHeight;
                destImageSize       = requestedSize;
                break;
            }

            if (alignDestBlitRect)
            {
                switch (resizeAlignment)
                {
                case ResizeAlignment.TopLeft:
                    destBlitRect.Offset(0, 0);
                    break;

                case ResizeAlignment.TopCenter:
                    destBlitRect.Offset((destImageSize.Width - destBlitRect.Width) / 2, 0);
                    break;

                case ResizeAlignment.TopRight:
                    destBlitRect.Offset(destImageSize.Width - destBlitRect.Width, 0);
                    break;

                case ResizeAlignment.CenterLeft:
                    destBlitRect.Offset(0, (destImageSize.Height - destBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.CenterCenter:
                    destBlitRect.Offset((destImageSize.Width - destBlitRect.Width) / 2, (destImageSize.Height - destBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.CenterRight:
                    destBlitRect.Offset((destImageSize.Width - destBlitRect.Width), (destImageSize.Height - destBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.BottomLeft:
                    destBlitRect.Offset(0, (destImageSize.Height - destBlitRect.Height));
                    break;

                case ResizeAlignment.BottomCenter:
                    destBlitRect.Offset((destImageSize.Width - destBlitRect.Width) / 2, destImageSize.Height - destBlitRect.Height);
                    break;

                case ResizeAlignment.BottomRight:
                    destBlitRect.Offset(destImageSize.Width - destBlitRect.Width, destImageSize.Height - destBlitRect.Height);
                    break;

                default:
                    break;
                }
            }

            if (alignSourceBlitRect)
            {
                switch (resizeAlignment)
                {
                case ResizeAlignment.TopLeft:
                    sourceBlitRect.Offset(0, 0);
                    break;

                case ResizeAlignment.TopCenter:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width) / 2, 0);
                    break;

                case ResizeAlignment.TopRight:
                    sourceBlitRect.Offset(sourceImageSize.Width - sourceBlitRect.Width, 0);
                    break;

                case ResizeAlignment.CenterLeft:
                    sourceBlitRect.Offset(0, (sourceImageSize.Height - sourceBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.CenterCenter:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width) / 2, (sourceImageSize.Height - sourceBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.CenterRight:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width), (sourceImageSize.Height - sourceBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.BottomLeft:
                    sourceBlitRect.Offset(0, sourceImageSize.Height - sourceBlitRect.Height);
                    break;

                case ResizeAlignment.BottomCenter:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width) / 2, sourceImageSize.Height - sourceBlitRect.Height);
                    break;

                case ResizeAlignment.BottomRight:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width), sourceImageSize.Height - sourceBlitRect.Height);
                    break;

                default:
                    break;
                }
            }

            var imageToUse = alignSourceBlitRect ? Crop(sourceImage, sourceBlitRect) : sourceImage;

            UIGraphics.BeginImageContext(destImageSize);
            var context = UIGraphics.GetCurrentContext();

            //context.TranslateCTM(0, destImageSize.Height);
            //context.ScaleCTM(1f, -1f);
            context.InterpolationQuality = interpolationQuality;
            context.SetAllowsAntialiasing(antiAliasing);
            context.SetFillColor(paddingColor.CGColor);
            context.FillRect(new CGRect(CGPoint.Empty, destImageSize));
            //context.DrawImage(destBlitRect, imageToUse.CGImage);
            imageToUse.Draw(destBlitRect);
            UIImage resizedImage = UIGraphics.GetImageFromCurrentImageContext();

            UIGraphics.EndImageContext();

            if (imageToUse != sourceImage)
            {
                imageToUse.Dispose();
            }

            return(resizedImage);
        }
Пример #6
0
        public static UILabel AddLabel(UIView view, UILabel label, ResizeAlignment alignment, UIEdgeInsets margins)
        {
            label.SizeToFit();
            label.TranslatesAutoresizingMaskIntoConstraints = false;
            //label.AdjustsFontSizeToFitWidth = true;
            view.AddSubview(label);
            view.AddConstraints(new[] {
                (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Left, NSLayoutRelation.Equal, view, NSLayoutAttribute.Left, 1f, margins.Left)),
                (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Right, NSLayoutRelation.Equal, view, NSLayoutAttribute.Right, 1f, margins.Right)),
            });
            switch (alignment)
            {
            case ResizeAlignment.TopLeft:
                view.AddConstraints(new[] {
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, view, NSLayoutAttribute.Top, 1f, margins.Top)),
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, view, NSLayoutAttribute.Top, 1f, +label.Frame.Height + margins.Top)),
                });
                label.TextAlignment = UITextAlignment.Left;
                break;

            case ResizeAlignment.TopCenter:
                view.AddConstraints(new[] {
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, view, NSLayoutAttribute.Top, 1f, margins.Top)),
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, view, NSLayoutAttribute.Top, 1f, +label.Frame.Height + margins.Top)),
                });
                label.TextAlignment = UITextAlignment.Center;

                break;

            case ResizeAlignment.TopRight:
                view.AddConstraints(new[] {
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, view, NSLayoutAttribute.Top, 1f, margins.Top)),
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, view, NSLayoutAttribute.Top, 1f, +label.Frame.Height + margins.Top)),
                });
                label.TextAlignment = UITextAlignment.Right;

                break;

            case ResizeAlignment.CenterLeft:
                view.AddConstraints(new[] {
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.CenterY, NSLayoutRelation.Equal, view, NSLayoutAttribute.CenterY, 1f, 0f)),
                });
                label.TextAlignment = UITextAlignment.Left;
                break;

            case ResizeAlignment.CenterCenter:
                view.AddConstraints(new[] {
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.CenterY, NSLayoutRelation.Equal, view, NSLayoutAttribute.CenterY, 1f, 0f)),
                });
                label.TextAlignment = UITextAlignment.Center;

                break;

            case ResizeAlignment.CenterRight:
                view.AddConstraints(new[] {
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.CenterY, NSLayoutRelation.Equal, view, NSLayoutAttribute.CenterY, 1f, 0f)),
                });
                label.TextAlignment = UITextAlignment.Right;
                break;

            case ResizeAlignment.BottomLeft:
                view.AddConstraints(new[] {
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, view, NSLayoutAttribute.Bottom, 1f, -(label.Frame.Height + margins.Bottom))),
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, view, NSLayoutAttribute.Bottom, 1f, margins.Bottom)),
                });
                label.TextAlignment = UITextAlignment.Left;
                break;

            case ResizeAlignment.BottomCenter:
                view.AddConstraints(new[] {
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, view, NSLayoutAttribute.Bottom, 1f, -(label.Frame.Height + margins.Bottom))),
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, view, NSLayoutAttribute.Bottom, 1f, margins.Bottom)),
                });
                label.TextAlignment = UITextAlignment.Left;
                break;

            case ResizeAlignment.BottomRight:
                view.AddConstraints(new[] {
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, view, NSLayoutAttribute.Bottom, 1f, -(label.Frame.Height + margins.Bottom))),
                    (NSLayoutConstraint)(NSLayoutConstraint.Create(label, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, view, NSLayoutAttribute.Bottom, 1f, margins.Bottom)),
                });
                label.TextAlignment = UITextAlignment.Left;
                break;
            }
            return(label);
        }
Пример #7
0
        public static Bitmap Resize(
            this Image image,
            Size requestedSize,
            ResizeMethod resizeMethod           = ResizeMethod.Stretch,
            ResizeAlignment resizeAlignment     = ResizeAlignment.CenterCenter,
            InterpolationMode interpolationMode = InterpolationMode.HighQualityBicubic,
            Color?paddingColor         = null,
            PixelFormat?newPixelFormat = null
            )
        {
            var  actualPaddingColor = paddingColor.GetValueOrDefault(Color.Transparent);
            var  pixelFormat        = newPixelFormat.GetValueOrDefault(image.PixelFormat);
            var  sourceImageSize    = image.Size;
            var  scaleWidth         = (requestedSize.Width / (float)sourceImageSize.Width);
            var  scaleHeight        = (requestedSize.Height / (float)sourceImageSize.Height);
            Size destImageSize;
            var  sourceBlitRect      = Rectangle.Empty;
            var  destBlitRect        = Rectangle.Empty;
            var  alignSourceBlitRect = false;
            var  alignDestBlitRect   = false;

            switch (resizeMethod)
            {
            case ResizeMethod.AspectFit:
                sourceBlitRect      = new Rectangle(Point.Empty, sourceImageSize);
                scaleWidth          = Math.Min(scaleWidth, scaleHeight);
                scaleHeight         = Math.Min(scaleWidth, scaleHeight);
                destBlitRect.Width  = (int)Math.Round(sourceImageSize.Width * scaleWidth, 0);
                destBlitRect.Height = (int)Math.Round(sourceImageSize.Height * scaleHeight, 0);
                destImageSize       = destBlitRect.Size;
                break;

            case ResizeMethod.AspectFitPadded:
                sourceBlitRect      = new Rectangle(Point.Empty, sourceImageSize);
                scaleWidth          = Math.Min(scaleWidth, scaleHeight);
                scaleHeight         = Math.Min(scaleWidth, scaleHeight);
                destBlitRect.Width  = (int)Math.Round(sourceImageSize.Width * scaleWidth);
                destBlitRect.Height = (int)Math.Round(sourceImageSize.Height * scaleHeight);
                destImageSize       = requestedSize;
                alignDestBlitRect   = true;
                break;

            case ResizeMethod.AspectFill:
                var sourceAspect = sourceImageSize.Width / (float)sourceImageSize.Height;
                var destAspect   = requestedSize.Width / (float)requestedSize.Height;
                if (destAspect > sourceAspect)
                {
                    sourceBlitRect      = new Rectangle(0, 0, sourceImageSize.Width, (int)Math.Round(sourceImageSize.Width / destAspect));
                    alignSourceBlitRect = true;
                }
                else if (destAspect < sourceAspect)
                {
                    sourceBlitRect      = new Rectangle(0, 0, (int)Math.Round(sourceImageSize.Height * destAspect), sourceImageSize.Height);
                    alignSourceBlitRect = true;
                }
                else
                {
                    sourceBlitRect = new Rectangle(Point.Empty, sourceImageSize);
                }
                destBlitRect  = new Rectangle(Point.Empty, requestedSize);
                destImageSize = requestedSize;
                break;

            case ResizeMethod.Stretch:
            default:
                sourceBlitRect      = new Rectangle(Point.Empty, sourceImageSize);
                destBlitRect.Width  = (int)Math.Round(sourceImageSize.Width * scaleWidth);
                destBlitRect.Height = (int)Math.Round(sourceImageSize.Height * scaleHeight);
                destImageSize       = requestedSize;
                break;
            }

            if (alignDestBlitRect)
            {
                switch (resizeAlignment)
                {
                case ResizeAlignment.TopLeft:
                    destBlitRect.Offset(0, 0);
                    break;

                case ResizeAlignment.TopCenter:
                    destBlitRect.Offset((destImageSize.Width - destBlitRect.Width) / 2, 0);
                    break;

                case ResizeAlignment.TopRight:
                    destBlitRect.Offset(destImageSize.Width - destBlitRect.Width, 0);
                    break;

                case ResizeAlignment.CenterLeft:
                    destBlitRect.Offset(0, (destImageSize.Height - destBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.CenterCenter:
                    destBlitRect.Offset((destImageSize.Width - destBlitRect.Width) / 2, (destImageSize.Height - destBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.CenterRight:
                    destBlitRect.Offset((destImageSize.Width - destBlitRect.Width), (destImageSize.Height - destBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.BottomLeft:
                    destBlitRect.Offset(0, (destImageSize.Height - destBlitRect.Height));
                    break;

                case ResizeAlignment.BottomCenter:
                    destBlitRect.Offset((destImageSize.Width - destBlitRect.Width) / 2, destImageSize.Height - destBlitRect.Height);
                    break;

                case ResizeAlignment.BottomRight:
                    destBlitRect.Offset(destImageSize.Width - destBlitRect.Width, destImageSize.Height - destBlitRect.Height);
                    break;

                default:
                    break;
                }
            }

            if (alignSourceBlitRect)
            {
                switch (resizeAlignment)
                {
                case ResizeAlignment.TopLeft:
                    sourceBlitRect.Offset(0, 0);
                    break;

                case ResizeAlignment.TopCenter:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width) / 2, 0);
                    break;

                case ResizeAlignment.TopRight:
                    sourceBlitRect.Offset(sourceImageSize.Width - sourceBlitRect.Width, 0);
                    break;

                case ResizeAlignment.CenterLeft:
                    sourceBlitRect.Offset(0, (sourceImageSize.Height - sourceBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.CenterCenter:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width) / 2, (sourceImageSize.Height - sourceBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.CenterRight:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width), (sourceImageSize.Height - sourceBlitRect.Height) / 2);
                    break;

                case ResizeAlignment.BottomLeft:
                    sourceBlitRect.Offset(0, sourceImageSize.Height - sourceBlitRect.Height);
                    break;

                case ResizeAlignment.BottomCenter:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width) / 2, sourceImageSize.Height - sourceBlitRect.Height);
                    break;

                case ResizeAlignment.BottomRight:
                    sourceBlitRect.Offset((sourceImageSize.Width - sourceBlitRect.Width), sourceImageSize.Height - sourceBlitRect.Height);
                    break;

                default:
                    break;
                }
            }

            Bitmap bitmap;

            if (destImageSize.Width != 0 && destImageSize.Height != 0)
            {
                bitmap = new Bitmap(destImageSize.Width, destImageSize.Height, pixelFormat);
                bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution);
                using (var graphics = Graphics.FromImage(bitmap)) {
                    graphics.Clear(actualPaddingColor);
                    graphics.InterpolationMode = interpolationMode;
                    graphics.DrawImage(
                        image,
                        destBlitRect,
                        sourceBlitRect,
                        GraphicsUnit.Pixel
                        );
                }
            }
            else
            {
                bitmap = new Bitmap(1, 1);
            }
            return(bitmap);
        }