Получение CGImage от CIImage - программирование
Подтвердить что ты не робот

Получение CGImage от CIImage

У меня есть UIImage, который загружается из CIImage с помощью:

tempImage = [UIImage imageWithCIImage:ciImage];

Проблема в том, что мне нужно обрезать tempImage до определенного CGRect, и единственный способ, которым я знаю, как это сделать, - использовать CGImage. Проблема в том, что в документации iOS 6.0 я нашел это:

CGImage
If the UIImage object was initialized using a CIImage object, the value of the property is NULL.

а. Как конфертировать из CIImage в CGImage? Я использую этот код, но у меня есть утечка памяти (и не могу понять, где):

+(UIImage*)UIImageFromCIImage:(CIImage*)ciImage {  
    CGSize size = ciImage.extent.size;  
    UIGraphicsBeginImageContext(size);  
    CGRect rect;  
    rect.origin = CGPointZero;  
    rect.size   = size;  
    UIImage *remImage = [UIImage imageWithCIImage:ciImage];  
    [remImage drawInRect:rect];  
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext();  
    remImage = nil;  
    ciImage = nil;  
    //
    return result;  
}
4b9b3361

Ответ 1

Смотрите документацию CIContext для createCGImage: fromRect:

CGImageRef img = [myContext createCGImage:ciImage fromRect:[ciImage extent]];

Из ответа на аналогичный вопрос: fooobar.com/questions/376184/...

Кроме того, поскольку для начала используется CIImage, вы можете использовать CIFilter для фактического обрезания изображения.

Ответ 2

Свифт 3, Свифт 4 и Свифт 5

Вот хорошая маленькая функция для преобразования CIImage в CGImage в Swift.

func convertCIImageToCGImage(inputImage: CIImage) -> CGImage? {
    let context = CIContext(options: nil)
    if let cgImage = context.createCGImage(inputImage, from: inputImage.extent) {
        return cgImage
    }
    return nil
}

Ответ 3

После некоторых поисковых запросов я нашел этот метод, который преобразует CMSampleBufferRef в CGImage:

+ (CGImageRef)imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer // Create a CGImageRef from sample buffer data
{
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(imageBuffer,0);        // Lock the image buffer

    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);   // Get information of the image
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    CGImageRef newImage = CGBitmapContextCreateImage(newContext);
    CGContextRelease(newContext);

    CGColorSpaceRelease(colorSpace);
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);
    /* CVBufferRelease(imageBuffer); */  // do not call this!

    return newImage;
}

(но я закрыл вкладку, поэтому не знаю, откуда я ее получил)