UIImage закругленные углы - PullRequest
       89

UIImage закругленные углы

61 голосов
/ 04 ноября 2008

Я пытаюсь получить закругленные углы на UIImage, то, что я читал до сих пор, самый простой способ - использовать маску изображений. Для этого я использовал код из TheElements iPhone Example и некоторый код изменения размера изображения, который я нашел. Моя проблема в том, что resizedImage всегда ноль, и я не нахожу ошибку ...

- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize
{
    CGSize imageSize = [self size];
    float width = imageSize.width;
    float height = imageSize.height;

    // scaleFactor will be the fraction that we'll
    // use to adjust the size. For example, if we shrink
    // an image by half, scaleFactor will be 0.5. the
    // scaledWidth and scaledHeight will be the original,
    // multiplied by the scaleFactor.
    //
    // IMPORTANT: the "targetHeight" is the size of the space
    // we're drawing into. The "scaledHeight" is the height that
    // the image actually is drawn at, once we take into
    // account the ideal of maintaining proportions

    float scaleFactor = 0.0; 
    float scaledWidth = targetSize.width;
    float scaledHeight = targetSize.height;

    CGPoint thumbnailPoint = CGPointMake(0,0);

    // since not all images are square, we want to scale
    // proportionately. To do this, we find the longest
    // edge and use that as a guide.

    if ( CGSizeEqualToSize(imageSize, targetSize) == NO )
    { 
        // use the longeset edge as a guide. if the
        // image is wider than tall, we'll figure out
        // the scale factor by dividing it by the
        // intended width. Otherwise, we'll use the
        // height.

        float widthFactor = targetSize.width / width;
        float heightFactor = targetSize.height / height;

        if ( widthFactor < heightFactor )
            scaleFactor = widthFactor;
        else
            scaleFactor = heightFactor;

        // ex: 500 * 0.5 = 250 (newWidth)

        scaledWidth = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the thumbnail in the frame. if
        // wider than tall, we need to adjust the
        // vertical drawing point (y axis)

        if ( widthFactor < heightFactor )
            thumbnailPoint.y = (targetSize.height - scaledHeight) * 0.5;

        else if ( widthFactor > heightFactor )
            thumbnailPoint.x = (targetSize.width - scaledWidth) * 0.5;
    }


    CGContextRef mainViewContentContext;
    CGColorSpaceRef colorSpace;

    colorSpace = CGColorSpaceCreateDeviceRGB();

    // create a bitmap graphics context the size of the image
    mainViewContentContext = CGBitmapContextCreate (NULL, targetSize.width, targetSize.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);

    // free the rgb colorspace
    CGColorSpaceRelease(colorSpace);    

    if (mainViewContentContext==NULL)
        return NULL;

    //CGContextSetFillColorWithColor(mainViewContentContext, [[UIColor whiteColor] CGColor]);
    //CGContextFillRect(mainViewContentContext, CGRectMake(0, 0, targetSize.width, targetSize.height));

    CGContextDrawImage(mainViewContentContext, CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledWidth, scaledHeight), self.CGImage);

    // Create CGImageRef of the main view bitmap content, and then
    // release that bitmap context
    CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext);
    CGContextRelease(mainViewContentContext);

    CGImageRef maskImage = [[UIImage imageNamed:@"Mask.png"] CGImage];

    CGImageRef resizedImage = CGImageCreateWithMask(mainViewContentBitmapContext, maskImage);
    CGImageRelease(mainViewContentBitmapContext);

    // convert the finished resized image to a UIImage 
    UIImage *theImage = [UIImage imageWithCGImage:resizedImage];

    // image is retained by the property setting above, so we can 
    // release the original
    CGImageRelease(resizedImage);

    // return the image
    return theImage;
}

Ответы [ 15 ]

1 голос
/ 15 октября 2009

Причина, по которой он работал с отсечением, а не с маскировкой, заключается в цветовом пространстве.

Документация Apple ниже.

маска Маска. Если маска является изображением, она должна находиться в цветовом пространстве DeviceGray, не должна иметь альфа-компонента и сама не может быть замаскирована маской изображения или маскирующим цветом. Если размер маски не совпадает с размером изображения, указанного в параметре изображения, то Кварц масштабирует маску для соответствия изображению.

0 голосов
/ 12 сентября 2018

Я думаю, это может быть очень связано: В iOS 11 есть очень элегантный способ округления каждого угла представления (изображения).

let imageView = UIImageView(image: UIImage(named: "myImage"))    
imageView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
imageView.layer.cornerRadius = 10.0
0 голосов
/ 27 ноября 2017

Я изо всех сил пытался закруглить углы окна UIImage в моей раскадровке. У меня был IBOutlet для моего UIImage под названием image. Прочитав кучу постов здесь, я просто добавил 3 строки, и это сработало отлично.

import UIKit

Тогда в viewDidLoad:

image.layer.cornerRadius = 20.0

image.layer.masksToBounds = true

Это для iOS 11.1 в Xcode 9.

0 голосов
/ 31 августа 2015

Для создания изображения закругленного угла мы можем использовать кварцевую сердцевину.

Первый Как добавить платформу QuartzCore?

Click  project -Targets
    ->project
       ->BuildPhase
           ->Link Binary with Libraries
             ->Then click + symbol finally select from list and add it

или еще

Click  project -Targets
    ->Targets
      ->general
        ->Linked Frameworks and Libraries
          ->Then click + symbol finally select from list and add the QuartzCore framework

Теперь импортируем

#import <QuartzCore/QuartzCore.h> 

в вашем ViewController

Затем в методе viewDidLoad

self.yourImageView.layer.cornerRadius = 5.0;
self.yourImageView.layer.borderWidth = 1.0f;
self.yourImageView.layer.borderColor = [UIColor blackColor].CGColor;
self.yourImageView.layer.masksToBounds = YES;
0 голосов
/ 04 ноября 2008

Смотрите здесь ... IMO, если вам абсолютно не нужно делать это в коде, просто наложите изображение сверху.

Что-то вроде ...

- (void)drawRect:(CGRect)rect 
{
    // Drawing code
    [backgroundImage drawInRect:rect];
    [buttonOverlay drawInRect:rect];    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...