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
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:
Imagen recortada:
Descarga del código fuente: Descarga del código fuente