美文网首页
关于位图

关于位图

作者: 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);

相关文章

  • 关于位图

    关于图片的原理: 图片只有当解析后 生成位图 存储在内存中 类似于网格状 一般状况下 像素宽*像素高 一个像素占4...

  • Linux中的位图

    什么是位图 位图(bitmap)的定义 维基百科中关于位图的介绍: 一种数据结构,代表了有限域中的稠集(dense...

  • 两个位图覆盖合成为一个位图

    /** *把两个位图覆盖合成为一个位图,以底层位图的长宽为基准 *@parambackBitmap在底部的位图 *...

  • 4款安卓小众黑科技APP,功能非常让人意外,请大家低调使用

    1、经络穴位图解 经络穴位图解是一款非常黑科技的安卓软件,功能非常全面,在生活方面非常的实用。里面提供了很多关于身...

  • BMP位图格式解析

    一般BMP图像文件由以下4部分组成:位图文件头、位图信息头、调色板、实际的位图数据。位图文件头数据结构: 位图信息...

  • 干货 | 非常完整的人体穴位图与功效(果断收藏)

    人体穴位作用图解大全更清晰直观的标注了各个人体穴位,包括头部穴位图、胸部穴位图、背部穴位图、胳膊手部穴位图、人体腿...

  • iOS 截屏图片

    和之前的iOS 关于图片的操作类似,都是通过位图上下文操作的,言归正传. 1、开启位图上下文 2、将当前控制器的v...

  • CorelDRAW位图转换矢量图

    使用CorelDRAW 软件中的快速描摹位图就是可以使位图转化为矢量图的一个过程,不过描摹位图之后,会丢掉很多位图...

  • 位图和布隆过滤器

    位图 位图的概念 位图(bitmap)其实就是哈希表的一种特殊情况。不同的是位图是通过二进制位来表示数据是否存在。...

  • ESP8266学习:U8G2驱动OLED

    drawXBM x:X位置。y:Y位置。w:位图的宽度。h:位图的高度。bitmap:指向位图开始的指针 draw...

网友评论

      本文标题:关于位图

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