如何绘制如下图像?我在照片编辑工具中创建了这个。但无法真正实现iOS。
https://stackoverflow.com/a/12665177/129202引导我朝着一个好方向前进,但实际上仿射变换的效果并非100%。
使用的代码:
+(UIImage*)createGradientOval2:(const CGSize)SIZECONTEXT {
const CGFloat SCALE = 2.0f;
UIGraphicsBeginImageContextWithOptions(SIZECONTEXT, NO, SCALE);
CGContextRef ctx = UIGraphicsGetCurrentContext();
// Create gradient
CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
const CGFloat colors [] = {
0.0, 1.0, 0.0, 1.00, // green
0.0, 1.0, 0.0, 1.00, // green
0.0, 1.0, 0.0, 1.00, // green
0.0, 1.0, 0.0, 1.00, // green
0.0, 1.0, 0.0, 1.00, // green
0.0, 1.0, 0.0, 1.00, // green
0.0, 1.0, 0.0, 1.00, // green
0.0, 1.0, 0.0, 1.00, // green
0.0, 1.0, 0.0, 1.00, // green
0.0, 1.0, 0.0, 0.00, // transparent
};
//CGGradientRef gradient = CGGradientCreateWithColors(baseSpace, (CFArrayRef)colors, locations);
CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 10);
CGColorSpaceRelease(baseSpace), baseSpace = NULL;
// Scaling transformation and keeping track of the inverse
CGAffineTransform scaleT = CGAffineTransformMakeScale(1, 2.0);
CGAffineTransform invScaleT = CGAffineTransformInvert(scaleT);
// Extract the Sx and Sy elements from the inverse matrix
// (See the Quartz documentation for the math behind the matrices)
CGPoint invS = CGPointMake(invScaleT.a, invScaleT.d);
const CGRect RECT = CGRectMake(0, 0, SIZECONTEXT.width / 2, SIZECONTEXT.height / 2);
// Transform center and radius of gradient with the inverse
CGPoint center = CGPointMake((RECT.size.width / 2) * invS.x, (RECT.size.height / 2) * invS.y);
CGFloat radius = (RECT.size.width / 2) * invS.x;
// Draw the gradient with the scale transform on the context
CGContextScaleCTM(ctx, scaleT.a, scaleT.d);
CGContextDrawRadialGradient(ctx, gradient, center, 0, center, radius, kCGGradientDrawsBeforeStartLocation);
// Reset the context
CGContextScaleCTM(ctx, invS.x, invS.y);
// Continue to draw whatever else ...
// Clean up the memory used by Quartz
CGGradientRelease(gradient);
return UIGraphicsGetImageFromCurrentImageContext();
}
答案 0 :(得分:1)
好的我有一个新的...我认为它好多了。平滑度等在STROKECOUNT
,MAXSTROKEWIDTH
等硬编码。这实际上使椭圆向外生长一点点。需要进行一些调整才能强制留在椭圆形的矩形内。
+(UIImage*)ellipseWithSmoothEdges:(const CGSize)SIZECONTEXT oval:(const CGRect)RECTFOROVAL {
const CGFloat SCALE = 2.0f;
UIColor* colorPaint = [UIColor greenColor];
UIGraphicsBeginImageContextWithOptions(SIZECONTEXT, NO, SCALE);
CGContextRef context = UIGraphicsGetCurrentContext();
UIBezierPath* pathEllipseForClippingto = [UIBezierPath bezierPathWithOvalInRect:RECTFOROVAL];
const int STROKECOUNT = 70;
const CGFloat BASEALPHA = 1.0f / (CGFloat)STROKECOUNT;
const CGFloat MAXSTROKEWIDTH = 50;
UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect:RECTFOROVAL];
CGContextSaveGState(context); {
[pathEllipseForClippingto addClip];
[colorPaint setFill];
[path fill];
CGContextRestoreGState(context);
}
for (int i = 0; i < STROKECOUNT; i++) {
[[UIColor colorWithRed:0 green:1 blue:0 alpha:BASEALPHA * i] setStroke];
path.lineWidth = MAXSTROKEWIDTH - i;
[path stroke];
}
UIImage* imageGenerated = UIGraphicsGetImageFromCurrentImageContext();
return imageGenerated;
}