путь обводки iphone, используемый для обрезки UIImage

Я очень новичок в CoreGraphics (хотя некоторое время занимался программированием для iphone)

Вопрос, у меня есть этот фрагмент, который пропорционально масштабируется и обрезает UIImage по кругу:

-(UIImage *)counterpartImageForSchedule:(Schedule *)counterpartSchedule inSize:(CGSize)size
{
    // This function returns a newImage, based on image, that has been:
    // - scaled to fit in (CGRect) rect
    // - and cropped within a circle of radius: rectWidth/2

    UIImage *image=[UIImage imageNamed:@"fakeuser1.png"];

    // when kendy sends hash, check that this image is not on the cache, otherwise download, clip & stylized
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(size.width, size.height), NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();


                //Get the width and heights
    CGFloat imageWidth = image.size.width;
    CGFloat imageHeight = image.size.height;
    CGFloat rectWidth = size.width;
    CGFloat rectHeight = size.height;

    //Calculate the scale factor
    CGFloat scaleFactorX = rectWidth/imageWidth;
    CGFloat scaleFactorY = rectHeight/imageHeight;

    if (scaleFactorX>scaleFactorY) {
        scaleFactorY=scaleFactorX;
    } else
    {
        scaleFactorX=scaleFactorY;
    }


    //Calculate the centre of the circle
    CGFloat imageCentreX = rectWidth/2;
    CGFloat imageCentreY = rectHeight/2;

    // Create and CLIP to a CIRCULAR Path
    // (This could be replaced with any closed path if you want a different shaped clip)
    CGFloat radius = rectWidth/2;
    CGContextBeginPath (context);
    CGContextAddArc (context, imageCentreX, imageCentreY, radius, 0, 2*M_PI, 0);


    CGContextClosePath (context);

    CGContextClip (context);

    //Set the SCALE factor for the graphics context
    //All future draw calls will be scaled by this factor
    CGContextScaleCTM (context, scaleFactorX, scaleFactorY);    
    // the stroke

    // Draw the IMAGE
    CGRect myRect = CGRectMake(0, 0, imageWidth, imageHeight);
    [image drawInRect:myRect];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();



    return newImage;
}

Вопрос в том, как я могу обвести путь, который я использую для обрезки изображения (скажем, 4 пикселя черного или белого цвета)? мне нужно нарисовать новый?

Любая помощь высоко ценится!


person David Homes    schedule 19.03.2014    source источник


Ответы (1)


Путь может быть таким же объектом, как и любой другой — в данном случае это CGPath (CGPathRef). Прежде чем использовать путь для чего-либо, инкапсулируйте его как CGPath (в данном случае, вероятно, CGMutablePathRef, или, возможно, вы можете вызвать CGContextCopyPath перед использованием пути для обрезки). Теперь вы можете повторно использовать этот путь.

Вот пример из одного из моих приложений, в котором я формирую путь, затем обвожу его, а затем обрезаю по тому же пути (c — это графический контекст):

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, CGRectGetMaxX(r) - radius, ins);
CGPathAddArc(path, nil, 
             radius+ins, radius+ins, radius, -M_PI/2.0, M_PI/2.0, true);
CGPathAddArc(path, nil, 
             CGRectGetMaxX(r) - radius, radius+ins, radius, M_PI/2.0, -M_PI/2.0, true);
CGPathCloseSubpath(path);
CGContextAddPath(c, path);
CGContextSetLineWidth(c, 2);
CGContextStrokePath(c);
CGContextAddPath(c, path);
CGContextClip(c);
CGPathRelease(path);

Другая возможность — использовать UIBezierPath — полноценный объект Objective-C вместо функций CGContext. Он инкапсулирует CGPath, и вы можете повторно использовать этот путь — закрепить его, а затем обвести. Или наоборот.

person matt    schedule 19.03.2014
comment
совершенно новичок в этом мате, CGContextBeginPath (контекст); имеет недействительный возврат, как я могу сделать то, что вы предлагаете? - person David Homes; 19.03.2014
comment
Я не понимаю, с чем это связано. Посмотрите документацию для CGMutablePathRef. Также см. мою книгу: apeth.com/iOSBook/ch15.html#_paths_and_drawing - person matt; 19.03.2014
comment
И я отредактировал свой ответ, вставив пример кода из одного из моих приложений. Обратите внимание, как, сформировав путь, я могу добавить его и обвести, а затем снова добавить и обрезать. - person matt; 19.03.2014
comment
тестирование, позвольте мне проверить, и я приму ответ, ценю вашу помощь, Мэтт! - person David Homes; 19.03.2014
comment
Развлекайся! Мне очень нравится Core Graphics, и я рад видеть, что вы увлекаетесь этим. Возможность создавать рисунок UIImage в реальном времени — очень крутая часть iOS, и мало кто ею пользуется. - person matt; 19.03.2014
comment
я знаю, делаю iOs с 99 года, только для этого одного проекта мне нужно взять квадратное изображение, масштабировать его, обрезать его до круга и добавить обводку. Все еще возникают проблемы с реализацией вашего решения, но это ошибка новичка. Мне просто нужно сделать это и двигаться вперед (много дел в этом проекте!!!!), так что я не собираюсь становиться гуру CoreGraphics за одну ночь. - person David Homes; 19.03.2014
comment
Найдите время, чтобы взглянуть на UIBezierPath. Сделать круг, обвести его и привязать к нему тривиально. Вам даже не нужно указывать графический контекст: он автоматически использует текущий контекст, который вы уже создали. - person matt; 19.03.2014