2

我想知道是否有一种方法可以CGImage在上下文中创建一个对应于矩形的方法?

我现在在做什么:

我正在使用从上下文CGBitmapContextCreateImage创建一个。CGImage然后,我CGImageCreateWithImageInRect用来提取该子图像。

阿尼尔

4

3 回答 3

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;
}
于 2012-12-02T02:10:54.780 回答
0

您可以按照此处所述创建裁剪图像,

例如:-

UIImage *image = //original image
CGRect rect = //cropped rect
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
UIImage *img = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef);

您需要从上下文中获取 CGImage 以使用上述代码对其进行裁剪。您可以CGBitmapContextCreateImage按照问题中所述使用。这是文档。

于 2012-12-01T22:20:49.893 回答
0

您可以使用分配的缓冲区创建 CGBitmapContext,并使用相同的缓冲区从头开始创建 CGImage。使用上下文和图像共享缓冲区,您可以绘制到上下文中,然后使用主图像的该部分创建一个 CGImage。

请注意,如果您之后绘制到相同的上下文中,裁剪后的图像实际上可能会接收到更改(取决于内部进行了多少共享引用而不是复制)。根据您正在做的事情,您可能会也可能不会觉得这是可取的。

于 2012-12-02T01:10:55.940 回答