Изменить размер UIImage с соотношением сторон?

Если вы хотите создать функцию, которая берет список ключевых слов и проверяет, что каждое ключевое слово представлено в значении, вы можете сделать что-то вроде этого.

keywords = ['black', 'ultra'] 

def dict_search(list_of_keywords):
    for key in dict.keys():
        if all(x in key for x in list_of_keywords):
            return(key)

In [1]: dict_search(keywords)
hoka one tor ultra high 2 wp boot - black
37
задан Andrew Vergunov 3 February 2017 в 14:54
поделиться

2 ответа

После установки прямоугольника экрана выполните следующее, чтобы решить, в каком прямоугольнике рисовать изображение:

float hfactor = value.bounds.size.width / screenRect.size.width;
float vfactor = value.bounds.size.height / screenRect.size.height;

float factor = fmax(hfactor, vfactor);

// Divide the size by the greater of the vertical or horizontal shrinkage factor
float newWidth = value.bounds.size.width / factor;
float newHeight = value.bounds.size.height / factor;

// Then figure out if you need to offset it to center vertically or horizontally
float leftOffset = (screenRect.size.width - newWidth) / 2;
float topOffset = (screenRect.size.height - newHeight) / 2;

CGRect newRect = CGRectMake(leftOffset, topOffset, newWidth, newHeight);

Если вы не хотите увеличивать изображения меньше, чем screenRect, сделайте убедитесь, что коэффициент больше или равен единице (например, коэффициент = fmax (коэффициент, 1) ).

Чтобы получить черный фон, вы, вероятно, захотите просто установить черный цвет контекста и вызвать fillRect перед рисованием изображения.

55
ответ дан 27 November 2019 в 04:50
поделиться

Я знаю, что это очень старо, но благодарит за то сообщение - оно перенаправило меня от попытки использовать масштаб для рисования изображения. В случае, если это имеет выгоду для любого, я сделал дополнительный класс, который я добавлю здесь. Это позволяет Вам изменять размеры изображения как это:

      UIImage imgNew = img.Fit(40.0f, 40.0f);

мне не нужна пригодная опция, но она могла легко быть расширена для поддержки Заливки также.

using CoreGraphics;
using System;
using UIKit;

namespace SomeApp.iOS.Extensions
{
  public static class UIImageExtensions
  {
    public static CGSize Fit(this CGSize sizeImage,
      CGSize sizeTarget)
    {
      CGSize ret;
      float fw;
      float fh;
      float f;

      fw = (float) (sizeTarget.Width / sizeImage.Width);
      fh = (float) (sizeTarget.Height / sizeImage.Height);
      f = Math.Min(fw, fh);
      ret = new CGSize
      {
        Width = sizeImage.Width * f,
        Height = sizeImage.Height * f
      };
      return ret;
    }

    public static UIImage Fit(this UIImage image,
      float width,
      float height,
      bool opaque = false,
      float scale = 1.0f)
    {
      UIImage ret;

      ret = image.Fit(new CGSize(width, height),
        opaque,
        scale);
      return ret;
    }

    public static UIImage Fit(this UIImage image,
      CGSize sizeTarget,
      bool opaque = false,
      float scale = 1.0f)
    {
      CGSize sizeNewImage;
      CGSize size;
      UIImage ret;

      size = image.Size;
      sizeNewImage = size.Fit(sizeTarget);
      UIGraphics.BeginImageContextWithOptions(sizeNewImage,
        opaque,
        1.0f);
      using (CGContext context = UIGraphics.GetCurrentContext())
      {
        context.ScaleCTM(1, -1);
        context.TranslateCTM(0, -sizeNewImage.Height);
        context.DrawImage(new CGRect(CGPoint.Empty, sizeNewImage),
          image.CGImage);
        ret = UIGraphics.GetImageFromCurrentImageContext();
      }
      UIGraphics.EndImageContext();
      return ret;
    }
  }
}

Согласно сообщению выше, это запускает новый контекст для изображения, затем для того изображения, это выясняет аспект и затем красит в изображение. Если Вы не сделали никакого XCode Swift dev время, UIGraphics немного назад к большинству систем, я работаю с, но не плохо. Одна проблема то, что битовые массивы нижней частью краски по умолчанию к вершине. Для обхождения этого

        context.ScaleCTM(1, -1);
        context.TranslateCTM(0, -sizeNewImage.Height);

Изменения ориентация рисования к более общему верхнему левому к нижней правой части..., но тогда необходимо переместить источник также следовательно TranslateCTM.

Хотелось бы надеяться, это экономит кому-то некоторое время.

Аплодисменты

0
ответ дан 27 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: