关于位图
关于图片的原理:
图片只有当解析后 生成位图 存储在内存中 类似于网格状一般状况下 像素宽*像素高 一个像素占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);
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 醒不来的梦
- 关于自我为中心的一点感想
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 关于Ruby的杂想
- 关于读书的思考
- 关于this的一些问题(1)
- 《声之形》
- 关于如何沟通的1/2/3