我想知道是否有办法在上下文中创建一个与矩形相对应的CGImage
?
我现在在做什么:
我正在使用CGBitmapContextCreateImage
从上下文创建CGImage
。然后,我使用CGImageCreateWithImageInRect
来提取该子图像。
阿尼尔
答案 0 :(得分:4)
试试这个:
static CGImageRef createImageWithSectionOfBitmapContext(CGContextRef bigContext,
size_t x, size_t y, size_t width, size_t height)
{
uint8_t *data = CGBitmapContextGetData(bigContext);
size_t bytesPerRow = CGBitmapContextGetBytesPerRow(bigContext);
size_t bytesPerPixel = CGBitmapContextGetBitsPerPixel(bigContext) / 8;
data += x * bytesPerPixel + y * bytesPerRow;
CGContextRef smallContext = CGBitmapContextCreate(data,
width, height,
CGBitmapContextGetBitsPerComponent(bigContext), bytesPerRow,
CGBitmapContextGetColorSpace(bigContext),
CGBitmapContextGetBitmapInfo(bigContext));
CGImageRef image = CGBitmapContextCreateImage(smallContext);
CGContextRelease(smallContext);
return image;
}
或者这个:
static CGImageRef createImageWithSectionOfBitmapContext(CGContextRef bigContext,
size_t x, size_t y, size_t width, size_t height)
{
uint8_t *data = CGBitmapContextGetData(bigContext);
size_t bytesPerRow = CGBitmapContextGetBytesPerRow(bigContext);
size_t bytesPerPixel = CGBitmapContextGetBitsPerPixel(bigContext) / 8;
data += x * bytesPerPixel + y * bytesPerRow;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, data,
height * bytesPerRow, NULL);
CGImageRef image = CGImageCreate(width, height,
CGBitmapContextGetBitsPerComponent(bigContext),
CGBitmapContextGetBitsPerPixel(bigContext),
CGBitmapContextGetBytesPerRow(bigContext),
CGBitmapContextGetColorSpace(bigContext),
CGBitmapContextGetBitmapInfo(bigContext),
provider, NULL, NO, kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
return image;
}
答案 1 :(得分:0)
您可以按照here,
所述创建裁剪图像,如下所示例如: -
UIImage *image = //original image
CGRect rect = //cropped rect
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
UIImage *img = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
您需要从上下文中获取CGImage以使用上面的代码来裁剪它。如上所述,您可以使用CGBitmapContextCreateImage
。这是the documentation.
答案 2 :(得分:0)
您可以使用分配的缓冲区创建CGBitmapContext,并使用相同的缓冲区从头开始创建CGImage。通过上下文和图像共享缓冲区,您可以绘制到上下文中,然后使用主图像的该部分创建CGImage。
请注意,如果您之后绘制到相同的上下文中,裁剪后的图像可能会实际获取更改(具体取决于共享引用 - 而不是内部复制的数量)。根据您正在做的事情,您可能会或可能不会发现这一点。