[iOS 使用CGImage获取并修改图片像素]

#define Mask8(x) ( (x) & 0xFF )
#define R(x) ( Mask8(x) )
#define G(x) ( Mask8(x >> 8 ) )
#define B(x) ( Mask8(x >> 16) )
#define A(x) ( Mask8(x >> 24) )
#define RGBAMake(r, g, b, a) ( Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )

- (UIImage *)processUsingPixels:(UIImage*)inputImage {
    // 1. Get the raw pixels of the image
    //定义最高32位整形指针 *inputPixels
    UInt32 * inputPixels;

    //转换图片为CGImageRef,获取参数:长宽高,每个像素的字节数(4),每个R的比特数
    CGImageRef inputCGImage = [inputImage CGImage];
    NSUInteger inputWidth = CGImageGetWidth(inputCGImage);
    NSUInteger inputHeight = CGImageGetHeight(inputCGImage);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    NSUInteger bytesPerPixel = 4;
    NSUInteger bitsPerComponent = 8;

    //每行字节数
    NSUInteger inputBytesPerRow = bytesPerPixel * inputWidth;

    //开辟内存区域,指向首像素地址
    inputPixels = (UInt32 *)calloc(inputHeight * inputWidth, sizeof(UInt32));

    //根据指针,前面的参数,创建像素层
    CGContextRef context = CGBitmapContextCreate(inputPixels, inputWidth, inputHeight,
                                                 bitsPerComponent, inputBytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    //根据目前像素在界面绘制图像
    CGContextDrawImage(context, CGRectMake(0, 0, inputWidth, inputHeight), inputCGImage);

    //接来下就是重点了!!!像素处理--------------------------------------------------------
    for (NSUInteger j = 0; j < inputHeight; j++) {
        for (NSUInteger i = 0; i < inputWidth; i++) {
            UInt32 * currentPixel = inputPixels + (j * inputWidth) + i;
            UInt32 color = *currentPixel;
                    UInt32 br,thisR,thisG,thisB,thisA;
                    //这里直接移位获得RBGA的值,以及输出写的非常好!
                     thisR=R(color);
                     thisG=G(color);
                     thisB=B(color);
                     thisA=A(color);
                    //NSLog(@"%d,%d,%d,%d",thisR,thisG,thisB,thisA);
                    br=B(color)-R(color);
                    *currentPixel = RGBAMake(br, br, br, A(color));
        }
    }
    //创建新图
    // 4. Create a new UIImage
    CGImageRef newCGImage = CGBitmapContextCreateImage(context);
    UIImage * processedImage = [UIImage imageWithCGImage:newCGImage];
    //释放
    // 5. Cleanup!
    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);
    free(inputPixels);

    return processedImage;
}
时间: 2024-10-08 22:56:41

[iOS 使用CGImage获取并修改图片像素]的相关文章

iOS开发- 相机(摄像头)获取到的图片自动旋转90度解决办法

http://www.tuicool.com/articles/IfEZre 今天写demo的时候发现, 如果把通过相机获取到的图片,直接进行操作, 比如裁剪, 缩放, 则会把原图片向又旋转90度. 刚开始觉得莫名其妙, 不知所措. 后来百度了一下,找到了解决办法. ps: 查找过程中, 碰到了一种说法: //get original photo from iOS photos //如果该图片大于2M,会自动旋转90度:否则不旋转 UIImage* originalImg=[dict objec

iOS开发-检测用户截屏, 并获取所截图片

微信可以检测到用户截屏行为(Home + Power),并在稍后点击附加功能按钮时询问用户是否要发送刚才截屏的图片,这个用户体验非常好.于是乎, 我也想着实现这个功能. 在iOS7之前, 如果用户截屏,系统会自动取消屏幕上的所有 touch 事件,(使用 touchesCancelled:withEvent: 这个方法)那么我们就可以检测这个方法的调用,然后加载本地最新图片再加以判断来实现我们的目的.但在 iOS 7 之后,截屏不再会取消屏幕的 touch 事件,所以导致了 Snapchat 和

【练习4.2】使用鼠标事件获取图片像素值

<学习OpenCV>中文版第4章第2题 题目要求: 点击图片是获取该点的颜色值,并在图像上点击鼠标处用文本将颜色值显示出来. 程序代码: 1 #include "stdafx.h" 2 #include <cv.h> 3 #include <highgui.h> 4 using namespace std; 5 using namespace cv; 6 7 void MouseCallBack(int event, int x, int y, in

iOS UIWebView截获html并修改便签内容

UIWebView使用中经常遇到用JS来处理的事情,今天又遇到了搜了搜,找了这篇文章 感觉不错 珍藏一下. 原文地址 http://jiapumin.iteye.com/blog/1558345    感谢原作者jiapumin 需求:混合应用UIWebView打开html后,UIWebView有左右滚动条,要去掉左右滚动效果: 方法:通过js截获UIWebView中的html,然后修改html标签内容: 实例代码: 服务器端html <html><head> <meta h

IOS UIWebView截获html并修改便签内容,宽度自适应

需求:混合应用UIWebView打开html后,UIWebView有左右滚动条,要去掉左右滚动效果:  方法:通过js截获UIWebView中的html,然后修改html标签内容:  实例代码:  服务器端html Java代码   <html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="

利用Photoshop修改图片以达到投稿要求

摘自:http://www.dxy.cn/bbs/thread/8602152#8602152 软件版本为Photoshop CS V8.0.1(中文版),投稿要求参见Neurosci Lett(http://authors.elsevier.com/ArtworkInstructions.html?dc=AI1).具体投稿要求各杂志均有差异.现代科学论文中,图片占有重要的地位,可以说是论文是否被接受的关键之一.文章中的图片大体可以分为三类:1)照片,多来自数码相机或CCD:2)来自采样软件,如

Opencv 中图片像素操作的应用实例——计算图片某一种颜色区域大小所占比

对图片进行处理,其中图片像素的处理是基本的过程,包括对图片像素的遍历,对每一个像素的RGB三个通道的灰度值的获取等. 以下是基于opencv 的一个应用实例,即计算图片中黄色区域大小占整个图片大小的比例. 1 // computerPercentage.cpp: 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include<opencv2/opencv.hpp> 7 #in

IOS开发系列--无限循环的图片浏览器

--UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授人以渔,这里会尽可能让大家明白其中的原理,找一些典型的控件进行说明,这样一来大家就可以触类旁通.今天我们主要来看一下UIScrollView的内容: UIView UIScrollView 实战--图片浏览器 UIView 在熟悉UIScrollView之前

李洪强iOS开发-网络新闻获取数据思路回顾

李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据  1.1 定义类方法返回单例对象 1.2 单例的实现,设置baseURL,设置超时时长等 02 创建一个分类, 传入一个类的参数返回一个数组,返回当前类的所有属性 用在模型中处理模型数据 03 创建图片轮播模型(model)类发送请求获取轮播图片的数据  3.1 定义属性: 标题,图片 定义两个类方法: (1)传入一个字典的参数