从 UIGraphicsImageContext 裁剪区域 CGRect
cropping an area CGRect from UIGraphicsImageContext
我在当前视图的 CGContext
中绘制了一个形状像箭头的 CGPath
。我想生成箭头的微型版本(缩略图),将其作为 Image
添加到显示所有选定箭头的 UITableView
。
我成功缩小了完整上下文的图片,使箭头小于应有的大小。理想情况下,我想将完整上下文的图像裁剪到箭头的边界。但是,我还没有成功。有线索吗?感谢您的帮助!
这是一张包含箭头的完整视图图片和另一张我正在生成的缩略图图片。
理想情况下,上面的缩略图将被裁剪为仅包含箭头 - 而不是完整的上下文。
我使用的代码如下:
- (UIImage*) imageForObject:(id<GraphicalObject>) object
inRect:(CGRect)rect {
UIImage *image = [UIImage new];
CGRect objectBounds = [object objectBounds];
UIGraphicsBeginImageContext(self.view.frame.size);//objectBounds.size);
CGContextRef context =UIGraphicsGetCurrentContext();
[object drawInContext:context];
//doesn't work
CGContextClipToRect(context, objectBounds);
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
名为 objectBounds
的 CGRect
有两个组成部分,一个 origin
和一个 size
。为了将对象正确绘制为缩略图,代码需要缩放图像(以获得正确的尺寸)和平移图像(将原点移动到 {0,0}
)。所以代码看起来像这样
- (UIImage *)getThumbnailOfSize:(CGSize)size forObject:(UIBezierPath *)object
{
// to maintain the aspect ratio, we need to compute the scale
// factors for x and y, and then use the smaller of the two
CGFloat xscale = size.width / object.bounds.size.width;
CGFloat yscale = size.height / object.bounds.size.height;
CGFloat scale = (xscale < yscale) ? xscale : yscale;
// start a graphics context with the thumbnail size
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();
// here's where we scale and translate to make the image fit
CGContextScaleCTM( context, scale, scale );
CGContextTranslateCTM( context, -object.bounds.origin.x, -object.bounds.origin.y );
// draw the object and get the resulting image
[object stroke];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
我在当前视图的 CGContext
中绘制了一个形状像箭头的 CGPath
。我想生成箭头的微型版本(缩略图),将其作为 Image
添加到显示所有选定箭头的 UITableView
。
我成功缩小了完整上下文的图片,使箭头小于应有的大小。理想情况下,我想将完整上下文的图像裁剪到箭头的边界。但是,我还没有成功。有线索吗?感谢您的帮助!
这是一张包含箭头的完整视图图片和另一张我正在生成的缩略图图片。
理想情况下,上面的缩略图将被裁剪为仅包含箭头 - 而不是完整的上下文。
我使用的代码如下:
- (UIImage*) imageForObject:(id<GraphicalObject>) object
inRect:(CGRect)rect {
UIImage *image = [UIImage new];
CGRect objectBounds = [object objectBounds];
UIGraphicsBeginImageContext(self.view.frame.size);//objectBounds.size);
CGContextRef context =UIGraphicsGetCurrentContext();
[object drawInContext:context];
//doesn't work
CGContextClipToRect(context, objectBounds);
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
名为 objectBounds
的 CGRect
有两个组成部分,一个 origin
和一个 size
。为了将对象正确绘制为缩略图,代码需要缩放图像(以获得正确的尺寸)和平移图像(将原点移动到 {0,0}
)。所以代码看起来像这样
- (UIImage *)getThumbnailOfSize:(CGSize)size forObject:(UIBezierPath *)object
{
// to maintain the aspect ratio, we need to compute the scale
// factors for x and y, and then use the smaller of the two
CGFloat xscale = size.width / object.bounds.size.width;
CGFloat yscale = size.height / object.bounds.size.height;
CGFloat scale = (xscale < yscale) ? xscale : yscale;
// start a graphics context with the thumbnail size
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();
// here's where we scale and translate to make the image fit
CGContextScaleCTM( context, scale, scale );
CGContextTranslateCTM( context, -object.bounds.origin.x, -object.bounds.origin.y );
// draw the object and get the resulting image
[object stroke];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}