Use CGImageRef para crear imágenes y realizar el recorte del área de la imagen (con código fuente)

Una conversión mutua entre CGImageRef y UIImage

CGImageRef es un puntero de estructura. A través de CGImageRef, se pueden obtener todos los parámetros de UIImage, como ancho y alto de píxeles, profundidad de bits del canal de color, profundidad de bits de píxeles, disposición de bytes de píxeles y orden de lectura, etc. La conversión entre CGImageRef y UIImage es como sigue:

Convertir UIImage a CGImageRef

    UIImage *image = [UIImage imageNamed:@"testImg"];
    CGImageRef imageRef = image.CGImage;

Convertir CGImageRef a UIImage

    CGImageRef imageRef = [UIImage imageNamed:@"testImg"].CGImage;
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];

Recuerde liberar CGImageRef cada vez que lo use, de lo contrario, provocará una pérdida de memoria. El método de liberación también es muy simple, como se muestra a continuación:

    CGImageRelease(imageRef); 

Dos métodos de creación de CGImageRef

Creado usando una fuente de datos png

Instrucciones

CGImageCreateWithPNGDataProvider(CGDataProviderRef cg_nullable source, const CGFloat * __nullable decode, bool shouldInterpolate, CGColorRenderingIntent intent)

Ejemplo de uso:

    NSString *path = [[NSBundle mainBundle] pathForResource:@"bundle8Bit" ofType:@".png"];
    NSData *bundleImgData = [NSData dataWithContentsOfFile:path];
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)bundleImgData);
    CGImageRef imageRef = CGImageCreateWithPNGDataProvider(provider, NULL, true, kCGRenderingIntentDefault);
    UIImage *image = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    
    self.imageV.image = image;

Creado usando una fuente de datos jpeg

Instrucciones

CGImageCreateWithJPEGDataProvider(CGDataProviderRef cg_nullable source, const CGFloat * __nullable decode, bool shouldInterpolate, CGColorRenderingIntent intent)

Ejemplo de uso:

    NSString *path = [[NSBundle mainBundle] pathForResource:@"houst" ofType:@".jpg"];
    NSData *bundleImgData = [NSData dataWithContentsOfFile:path];
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)bundleImgData);
    CGImageRef imageRef = CGImageCreateWithJPEGDataProvider(provider, NULL, true, kCGRenderingIntentDefault);
    UIImage *image = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    
    self.imageV.image = image;

Creado utilizando una fuente de datos de matriz

El uso de fuentes de datos matriciales para crear imágenes es el método más flexible, que básicamente puede satisfacer todas nuestras necesidades de personalización y puede implementar cambios a nivel de píxel en las imágenes, utilizando el nombre del método

CGImageCreate(size_t ancho, size_t height,size_t bitsPerComponent, size_t bitsPerPixel, size_t bytesPerRow, CGColorSpaceRef cg_nullable space, CGBitmapInfo bitmapInfo,CGDataProviderRef cg_nullable provider,const CGFloat * __nullable decode, bool shouldInterpolate,CGColorRenderingIntent intent)

Los parámetros se analizan de la siguiente manera:
size_t width ancho de imagen (nivel de píxel)
size_t height alto de imagen (nivel de píxel)
size_t bitsPerComponent profundidad de bits de cada canal de píxeles (número de bits)
size_t bitsPerPixel profundidad de bits de cada punto de píxel (número de bits)
size_t bytesPerRow espacio de píxel por fila Tamaño (en bytes)
CGColorSpaceRef cg_nullable space Espacio de color
CGBitmapInfo bitmapInfo Disposición de píxeles y orden de lectura
CGDataProviderRef cg_nullable proveedor Data supply source
const CGFloat * __nullable decode Decode arrr Generalmente pasa nulo para mantener los datos de origen
bool shouldInterpolate Si se usa la diferencia para imagen de transición suave
CGColorRenderingIntent La forma en que las intenciones se asignan de un espacio de color a otro

Cómo utilizar

//创建一个宽2000像素 高3000像素 每通道8bit 一共三通道(无alpha通道) 使用rgb颜色空间 的一张纯红色的图片
    size_t imageWidth = 2000;
    size_t imageHeight = 3000;
    size_t bitsPerComponent = 8;
    size_t bitsPerPixel = 24;
    size_t bytesPerRow = imageWidth * bitsPerPixel / 8;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGImageByteOrderDefault;

    //创建纯红色数据源
    int byteIndex = 0;
    unsigned char *rawData = (unsigned char*) malloc(imageWidth * imageHeight * 3);
    for (int i = 0; i < imageHeight; i ++) {
        for (int j = 0; j < imageWidth; j ++) {
            rawData[byteIndex ++] = 255; //red通道
            rawData[byteIndex ++] = 0;  //green通道
            rawData[byteIndex ++] = 0;  //blue通道
        }
    }
    CGDataProviderRef dataProviderRef = CGDataProviderCreateWithData(NULL,
                                                                     rawData,
                                                                     imageWidth*imageHeight*3,
                                                                     NULL);

    CGImageRef imageRef = CGImageCreate(imageWidth,
                                        imageHeight,
                                        bitsPerComponent,
                                        bitsPerPixel,
                                        bytesPerRow,
                                        colorSpaceRef,
                                        bitmapInfo,
                                        dataProviderRef,
                                        nil,
                                        NO,
                                        kCGRenderingIntentDefault);
    UIImage *image = [UIImage imageWithCGImage:imageRef];
    CGColorSpaceRelease(colorSpaceRef);
    CGDataProviderRelease(dataProviderRef);
    CGImageRelease(imageRef);
    
    self.imageV.image = image;

Resultado de la creación
inserte la descripción de la imagen aquí
Comprobación de la información de la imagen de salida:

    size_t bitsPerComponentCheck = CGImageGetBitsPerComponent(imageRef);
    printf("每个通道占用的位数:%zu\n",bitsPerComponentCheck);
    size_t bitsPerPixelCheck = CGImageGetBitsPerPixel(imageRef);
    printf("每个像素占用的位数:%zu",bitsPerPixelCheck);
输出结果:
每个通道占用的位数:8
每个像素占用的位数:24

De acuerdo con los parámetros que creamos

Tres usan CGImageRef para recortar la imagen

方法 CGImageCreateWithImageInRect(CGImageRef cg_imagen anulable, CGRect rect)

Algunos ejemplos de métodos de uso son los siguientes

    NSString *path = [[NSBundle mainBundle] pathForResource:@"bundle8Bit" ofType:@".png"];
    NSData *bundleImgData = [NSData dataWithContentsOfFile:path];
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)bundleImgData);
    CGImageRef imageRef = CGImageCreateWithPNGDataProvider(provider, NULL, true, kCGRenderingIntentDefault);
    CGImageRef clipImageRef = CGImageCreateWithImageInRect(imageRef, CGRectMake(0, 0, 100, 200));
    UIImage *image = [UIImage imageWithCGImage:clipImageRef];
    self.imageV.image = image;

Tome la esquina superior izquierda de la imagen como vértice y recorte el área de la imagen con un ancho de píxel de 100 y una altura de 200.
Recorte la imagen original:
inserte la descripción de la imagen aquí
Imagen recortada:
inserte la descripción de la imagen aquí
Descarga del código fuente: Descarga del código fuente

Supongo que te gusta

Origin blog.csdn.net/mumubumaopao/article/details/130756475
Recomendado
Clasificación