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 に答える