关于图片的原理:
图片只有当解析后 生成位图 存储在内存中 类似于网格状 一般状况下 像素宽*像素高 一个像素占4个字节 32位 ,而颜色空间决定红绿蓝透明度的顺序 一般我们用到的是RGBA颜色空间,RGBA分别占一个字节,像电视机等其他颜色展示用的就不是RGBA模式,而且每个颜色单色部分占的位数也不同
改变图片:根据开始解析后在位图中存储的二进制数据,获取到位图的首地址,逐个遍历, 开辟出另一块相同大小的空间,按照需要改变的规律逐个改变存储的二进制数据,利用这些处理的新数据生成一张新的图片
//先将图片解析 否则没有位图,利用路径 导入的图片不会解析的
UIImage *image = [UIImage imageNamed:@"gun"];
CGImageRef imageRef = [image CGImage];
///获取到当前图片的各项参数
size_t width = CGImageGetWidth(imageRef); //像素宽
size_t height = CGImageGetHeight(imageRef); //像素高
size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef);//组成颜色的部分的位 RGB模式为8位
size_t bitsPerPixel = CGImageGetBitsPerPixel(imageRef); //一个像素占几个字节 4
size_t bytesPerRow = CGImageGetBytesPerRow(imageRef); //一行像素占多少字节
CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef); //颜色空间 RGBA
CGBitmapInfo bitMapInfo = CGImageGetBitmapInfo(imageRef); //透明度位置信息
bool shouldInterpolate = CGImageGetShouldInterpolate(imageRef); //锯齿话信息
CGColorRenderingIntent colorRending = CGImageGetRenderingIntent(imageRef);
///获取解析出的图片的位图信息
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
CFDataRef dataRef = CGDataProviderCopyData(dataProvider);
///获取到了位图的首地址
UInt8 *startLocation = (UInt8 *)CFDataGetBytePtr(dataRef);
//遍历位图的各个像素 改变颜色的值
for (NSInteger i = 0; i
for (NSInteger j = 0; j
///当前像素
UInt8 *currentLocation = startLocation + i*bytesPerRow + j*4;
//该地址的 RGBA模式 每个元素占一个字节 currentLocation/currentLocation+1/..currentLocation+3
UInt8 red = *currentLocation;
UInt8 green = *(currentLocation+1);
UInt8 blue = *(currentLocation+2);
// UInt8 alpha = *(currentLocation+3);
//此处:为改变图片样子的核心代码
*currentLocation = 255-red;
*(currentLocation+1) = 255-green;
*(currentLocation+2) = 255-blue;
///改变图片的透明度 效果如何
UInt8 randomAlpha = (UInt8)arc4random_uniform(2);
*(currentLocation+3) = randomAlpha;
}
}
///利用copy出来的CFdata重新构建位图 创建一张新的图片
CFDataRef newDataRef = CFDataCreate(NULL, startLocation, CFDataGetLength(dataRef));
CGDataProviderRef newDataProvider = CGDataProviderCreateWithCFData(newDataRef);
///创建新的图片
CGImageRef newImageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitMapInfo, newDataProvider, NULL, shouldInterpolate, colorRending);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
self.imageView.image = newImage;
///释放空间
CFRelease(newDataRef);
CFRelease(newDataProvider);
CGImageRelease(newImageRef);