美文网首页
关于位图

关于位图

作者: ZZ_军哥 | 来源:发表于2020-09-16 14:07 被阅读0次

    关于图片的原理:

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

    相关文章

      网友评论

          本文标题:关于位图

          本文链接:https://www.haomeiwen.com/subject/itocyktx.html