Можно ли добавить тень на изображение с помощью CoreGraphics на iPhone? - PullRequest
0 голосов
/ 22 мая 2011

У меня проблема с тем, что Core Graphics рисует тень под моим замаскированным изображением.

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

Это мой код:

CGContextRef context = CGBitmapContextCreate(NULL, imageRect.size.width, imageRect.size.height, 8, 0, CGImageGetColorSpace(image.CGImage), kCGImageAlphaPremultipliedLast);

CGContextSetRGBFillColor(context, 1, 1, 1, 1);
CGContextFillRect(context, imageRect);

CGContextClipToMask(context, imageRect, image.CGImage);

CGContextSetRGBFillColor(context, 0, 0, 0, 1);
CGContextFillRect(context, imageRect);

CGImageRef bwCGImage = CGBitmapContextCreateImage(context);
UIImage *bwImage = [UIImage imageWithCGImage:bwCGImage scale:image.scale orientation:image.imageOrientation];

CGContextRelease(context);
CGImageRelease(bwCGImage);


UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0);
[[UIColor whiteColor] set];
UIRectFill(CGRectMake(0, 0, image.size.width, image.size.height));

UIImage *normalBackgroundImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();


CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(bwImage.CGImage), CGImageGetHeight(bwImage.CGImage), CGImageGetBitsPerComponent(bwImage.CGImage), CGImageGetBitsPerPixel(bwImage.CGImage), CGImageGetBytesPerRow(bwImage.CGImage), CGImageGetDataProvider(bwImage.CGImage), NULL, YES);

CGImageRef normalImageRef = CGImageCreateWithMask(normalBackgroundImage.CGImage, imageMask);

UIImage *normalImage = [UIImage imageWithCGImage:normalImageRef scale:image.scale orientation:image.imageOrientation];


CGImageRelease(imageMask);
CGImageRelease(normalImageRef);

На самом деле все работает нормально. Только тень отсутствует. Как я могу это нарисовать?

1 Ответ

2 голосов
/ 22 мая 2011

Я всегда рекомендую великолепный Quartz 2D Guide от Apple.Учитывая ваш вопрос, вы должны прочитать главу Shadows

Она включает в себя отличную демонстрацию (включая комментарии)

void MyDrawWithShadows (CGContextRef myContext, // 1
                         float wd, float ht);
{
    CGSize          myShadowOffset = CGSizeMake (-15,  20);// 2
    float           myColorValues[] = {1, 0, 0, .6};// 3
    CGColorRef      myColor;// 4
    CGColorSpaceRef myColorSpace;// 5

    CGContextSaveGState(myContext);// 6

    CGContextSetShadow (myContext, myShadowOffset, 5); // 7
    // Your drawing code here// 8
    CGContextSetRGBFillColor (myContext, 0, 1, 0, 1);
    CGContextFillRect (myContext, CGRectMake (wd/3 + 75, ht/2 , wd/4, ht/4));

    myColorSpace = CGColorSpaceCreateDeviceRGB ();// 9
    myColor = CGColorCreate (myColorSpace, myColorValues);// 10
    CGContextSetShadowWithColor (myContext, myShadowOffset, 5, myColor);// 11
    // Your drawing code here// 12
    CGContextSetRGBFillColor (myContext, 0, 0, 1, 1);
    CGContextFillRect (myContext, CGRectMake (wd/3-75,ht/2-100,wd/4,ht/4));

    CGColorRelease (myColor);// 13
    CGColorSpaceRelease (myColorSpace); // 14

    CGContextRestoreGState(myContext);// 15
}
...