Tag: 核心graphics

从另一个path的线宽轮廓生成一个CGPath

我可能不会用最好的方式解释这个,所以请忍受我。 我有一个在MKMapView对象之上绘制的CGPath: 我能够实现这一目标的方法是为较暗的蓝线创build一个CGPath,然后创build该path的副本,然后用半透明的蓝色笔触较厚的版本。 以下是我目前使用的代码: // set the shadow around the path line CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); CGContextSetRGBStrokeColor(context, 0.0f, 0.0f, 0.0f, 0.0f); CGContextSetRGBFillColor(context, 0.0f, 0.0f, 1.0f, 0.4f); CGPathRef shadowPath = CGPathCreateCopyByStrokingPath(self.path.CGPath, NULL, 80.0f, kCGLineCapRound, kCGLineJoinRound, 0.0f); CGContextBeginPath(context); CGContextAddPath(context, shadowPath); CGContextDrawPath(context, kCGPathFillStroke); CGContextRestoreGState(context); CGPathRelease(shadowPath); 工作得很好,到目前为止没有错。 然而,我想要做的是获得一个更厚的半透明蓝色区域轮廓的CGPathRef。 下面是另一张屏幕截图,显示我想要的这个伪path(手绘为红色): 这怎么可能?

核心graphics的三angular形渐变

我试图在视图中绘制一个这样的三angular形(一个UIView,一个NSView): 我的第一个想法是CoreGraphics,但我找不到任何信息可以帮助我绘制任意颜色的三点之间的渐变。 任何帮助? 谢谢!

核心graphics – 如何从UIImage中裁剪不透明的像素?

我有一个UIImage是从一个透明的PNG(500×500像素)阅读。 在图像的某个地方,有一张我想要裁剪的图像,并保存为一个单独的UIImage。 我也想存储X和Y坐标,这个坐标是根据新裁剪的矩形的左侧和顶部有多less透明像素。 我能够用这个代码裁剪图像: – (UIImage *)cropImage:(UIImage *)image atRect:(CGRect)rect { double scale = image.scale; CGRect scaledRect = CGRectMake(rect.origin.x*scale,rect.origin.y*scale,rect.size.width*scale,rect.size.height*scale); CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], scaledRect); UIImage *cropped = [UIImage imageWithCGImage:imageRef scale:scale orientation:image.imageOrientation]; CGImageRelease(imageRef); return cropped; } 这实际上切断了顶部和左侧的透明像素:S(如果我能够裁剪右侧和底部的像素,这将是非常好的!)。 然后将图像的其余部分调整为我指定的矩形。 不幸的是,虽然我需要剪切图片中间的图片,但我需要的尺寸能够变为dynamic的。 现在已经挣扎了好几个小时了。 有任何想法吗?

如何重绘只有一个特定的图层? (IOS,SWIFT)

我有我的UIView 。 我在我的UIView画东西。 我添加了一个CALayer到我的UIView 。 现在我想让我的控制器只重绘我添加的CALayer。 我怎么做 ? 在我的实际代码中,它将重绘主视图。 我怎样才能重绘我的子视图(myshapelayer)? override func drawRect(rect: CGRect) { var myshapelayer:CAShapeLayer=CAShapeLayer(); var testbezier:UIBezierPath=UIBezierPath(); testbezier.moveToPoint(CGPoint(x: 60, y: 80)); … … myshapelayer.strokeColor=UIColor.blueColor().CGColor; myshapelayer.path=testbezier.CGPath; newlayer.addSublayer(myshapelayer) <draw on my main view> 控制器: myview.setNeedsDisplay();

重叠不同颜色和Alpha的UIViews

有没有办法重叠2个或更多的UIViews与不同的背景颜色和alphas给出另一种颜色的外观? 例如,在一个蓝色的UIView顶部放置一个红色的UIView ,以给出一个洋红色的UIView的外观。

从CIImage转换它后UIImage横向

我在UIImage应用filter,但转换后,它显示为侧面。 以下是我的代码。 CIImage *ciImage = [[CIImage alloc] initWithImage:self.imgToProcess]; CIFilter *filter = [CIFilter filterWithName:@"CIPhotoEffectChrome" keysAndValues:kCIInputImageKey, ciImage, nil]; [filter setDefaults]; CIContext *context = [CIContext contextWithOptions:nil]; CIImage *outputImage = [filter outputImage]; CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]]; UIImage *newImage = [[UIImage alloc]initWithCIImage:outputImage]; 它在newImage和尺寸中成功呈现,但图像是侧面的。 上面的代码中有没有导致方向改变的地方?

如何优化这个image processing,用最接近的可用RGBreplace图像上的所有像素?

我试图用最接近的可用RGBreplaceinput图像的所有像素。 我有一个数组包含颜色和input图像。 这里是我的代码,它给我一个预期的输出图像,但它需要很长的时间(约一分钟)来处理一个图像。 任何人都可以帮我改进代码吗? 或者,如果您有任何其他build议,请帮助。 UIGraphicsBeginImageContextWithOptions(CGSizeMake(CGImageGetWidth(sourceImage),CGImageGetHeight(sourceImage)), NO, 0.0f); //Context size I keep as same as original input image size //Otherwise, the output will be only a partial image CGContextRef context; context = UIGraphicsGetCurrentContext(); //This is for flipping up sidedown CGContextTranslateCTM(context, 0, self.imageViewArea.image.size.height); CGContextScaleCTM(context, 1.0, -1.0); // init vars float d = 0; // squared error […]

dynamic改变基于scrollView的位置

我有一个“U”形UIBezierPath ,我用myImage.layer作为animation的path 。 我也有一个scrollView。 我的目标是有一个自定义的“拉到刷新”animation。 我遇到的问题是,我希望我的myImage.layer根据scrollView滚动多less进行更新。 当scrollView被拉下时, myImage.layer沿着一个“U”形pathanimation。 这是我作为UIBezierPath创build的代码中的path 。 这是我如何计算scrollView被拉下多远: func scrollViewDidScroll(scrollView: UIScrollView) { let offsetY = CGFloat(max(-(scrollView.contentOffset.y + scrollView.contentInset.top), 0.0)) self.progress = min(max(offsetY / frame.size.height, 0.0), 1.0) if !isRefreshing { redrawFromProgress(self.progress) } } 这是dynamic更新位置的function(它不工作): func redrawFromProgress(progress: CGFloat) { // PROBLEM: This is not correct. Only the `x` position is dynamic based on scrollView […]

调用layer.setNeedsDisplay()显示黑色背景

当我在我的UIView的CALayer(直接或通过needsDisplayOnBoundsChange )调用setNeedsDisplay()时,它将背景绘制为黑色。 myView.layer.setNeedsDisplay() 当我直接调用UIView上的setNeedsDisplay()时,它不会显示为黑色: myView.setNeedsDisplay() 为什么会发生这种情况,我该如何解决?

为什么MKOverlayRenderer上的drawRect变慢

对于一个应用程序,我必须在MKMapView上放置一个MKCircle注解。 但是,圈子需要移动/resize。 我知道这已经被问到了,例如在MKMapView中移动MKCircle,其中删除/添加注释被build议获得该行为。 不过,我认为绘图速度很慢,就像这篇文章中的用户: MKCircle的平滑resize 。 由于现在有这个问题的答案,这个问题似乎使用YHAnimatedCircleView 。 我的意思是说,当我使用UISlider来改变圆的半径时,重绘是sl and不驯的,我也可以注意到用来绘制的瓷砖。 我创build了一个小testing代码,覆盖子类MKOverlayRenderer的drawMapRect 。 代码如下: -(void) drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context { MKCircle* circleOverlay = (MKCircle*)self.overlay; CLLocationCoordinate2D point = circleOverlay.coordinate; CGPoint locationPoint = [self pointForMapPoint:MKMapPointForCoordinate(point)]; CGFloat radius = MKMapPointsPerMeterAtLatitude(circleOverlay.coordinate.latitude) * circleOverlay.radius; CGRect circleRect = CGRectMake(locationPoint.x – radius, locationPoint.y – radius, radius * 2.0, radius * 2.0); CGContextSaveGState(context); CGContextSetFillColorWithColor(context, [UIColor […]