Можно ли отобразить изображение в Core Graphics с изменением размера Aspect Fit? - PullRequest
1 голос
/ 15 января 2012

CALayer может сделать это, и UIImageView может сделать это. Могу ли я напрямую отобразить изображение с форматным соотношением с Core Graphics? UIImage drawInRect не позволяет мне устанавливать механизм изменения размера.

Ответы [ 4 ]

11 голосов
/ 22 июля 2013

Если вы уже связываете AVFoundation , в этой структуре предусмотрена функция подгонки:

CGRect AVMakeRectWithAspectRatioInsideRect(CGSize aspectRatio, CGRect boundingRect);

Например, чтобы масштабировать изображение по размеру:

UIImage *image = …;
CRect targetBounds = self.layer.bounds;
// fit the image, preserving its aspect ratio, into our target bounds
CGRect imageRect = AVMakeRectWithAspectRatioInsideRect(image.size, 
                                                       targetBounds);

// draw the image
CGContextDrawImage(context, imageRect, image.CGImage);
5 голосов
/ 15 января 2012

Вы должны сделать математику самостоятельно. Например:

// desired maximum width/height of your image
UIImage *image = self.imageToDraw;
CGRect imageRect = CGRectMake(10, 10, 42, 42); // desired x/y coords, with maximum width/height

// calculate resize ratio, and apply to rect
CGFloat ratio = MIN(imageRect.size.width / image.size.width, imageRect.size.height / image.size.height);
imageRect.size.width = imageRect.size.width * ratio;
imageRect.size.height = imageRect.size.height * ratio;

// draw the image
CGContextDrawImage(context, imageRect, image.CGImage);

Кроме того, вы можете встроить UIImageView в качестве подпредставления вашего представления, что дает вам простые в использовании опции для этого. Для аналогичной простоты использования, но лучшей производительности вы можете встроить слой, содержащий изображение, в слой вашего представления. Любой из этих подходов заслуживает отдельного вопроса, если вы решите пойти по этому пути.

1 голос
/ 10 апреля 2013

вот решение

CGSize imageSize = yourImage.size;
CGSize viewSize = CGSizeMake(450, 340); // size in which you want to draw

float hfactor = imageSize.width / viewSize.width;
float vfactor = imageSize.height / viewSize.height;

float factor = fmax(hfactor, vfactor);

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

CGRect newRect = CGRectMake(xOffset,yOffset, newWidth, newHeight);
[image drawInRect:newRect];

- вежливость https://stackoverflow.com/a/1703210

1 голос
/ 15 января 2012

Конечно можно. Он нарисует изображение в любом проходящем прямоугольнике. Так что просто передайте прямоугольник с аспектами. Конечно, вам нужно немного поработать над математикой, но это довольно просто.

...