关于位图

关于图片的原理:

图片只有当解析后 生成位图 存储在内存中 类似于网格状  一般状况下 像素宽*像素高 一个像素占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);

你可能感兴趣的:(关于位图)