objective-c中如何从UIImage中获取像素信息

翻译自Obtaining pixel data from a UIImage

UIImage是我们在ios中非常熟悉的数据结构了,用它来存储图片非常方便。在OpenCV类库中,使用是另外的数据结构来存储图片,这时,我们就面临一个问题:如何才能把UIImage装换为其他类库也能识别的数据结构呢?

尽管不同的图片处理类库有不同的数据结构来处理图片,但是有一种结构是被所有的图片处理类库所识别的,那就是raw格式,也称之为原生格式。在raw格式中,每个像素通过一个unsigned byte的数组来表示,这个数组中存储了这个像素的RGBA值或者灰度值。如果你处理的是视频格式,你可能需要使用YUV,否则,你需要使用的就是RGBA值或者灰度值,这些信息会被存储在一个数组中。你可能会想,我如何才能从UIImage中方便的获取相应的像素信息呢?啊哈,你有福了。我实现了一个Category来解决这个问题,如下:

UIImage+Pixels.h

UIImage+Pixels.m

你可以使用如下代码来获取每个像素的灰度值:

for(int i=0;i<self.size.height;i++)
{
    for(int y=0;y<self.size.width;y++)
    {
        NSLog(@"0x%X",pixelData[(i*((int)self.size.width))+y]);
    }
}

由于0x00代表没有亮度,而0xFF代表最大的亮度,所以,对于黑色的图片,返回的是一系列的0x00,对于白色的照片,返回的是一系列的0xFF。

你可以使用如下代码获取每个像素的RGBA值:

for(int i=0;i<self.size.height;i++)
{
    for(int y=0;y<self.size.width;y++)
    {
        unsigned char r = pixelData[(i*((int)self.size.width)*4)+(y*4)];
        unsigned char g = pixelData[(i*((int)self.size.width)*4)+(y*4)+1];
        unsigned char b = pixelData[(i*((int)self.size.width)*4)+(y*4)+2];
        unsigned char a = pixelData[(i*((int)self.size.width)*4)+(y*4)+3];
        NSLog(@"r = 0x%X g = 0x%X b = 0x%X a = 0x%X",r,g,b,a);
    }
}

对于红色的图片,你会得到如下结果:r = 0xFF g = 0×0 b = 0×0 a = 0xFF

对于蓝色的图片,你会得到如下结果:r = 0×0 g = 0×0 b = 0xFF a = 0xFF

对于每个像素,需要通过red, green, blue, alpha四个值来代表,即RGBA值。对于alpha值,你可能会感到疑惑,这个值是标志图片的不透明度的,0x00代表100%透明,0xFF代表100%不透明。我发现,在大多数图片处理中,你最好忽略alpha这个值。

下面我们来讨论下如何从UIImage中取出某个特定坐标的像素?

对于灰度值,由于每个像素只由一个值代表,故我们可以把一张图片的像素布局看成一个表格,每个像素有自己的一个索引,对于第一个像素它的索引是(0, 0),第二个像素索引是(1, 0)。用如下代码即可取到对应坐标的像素的灰度值:

int x = 10;
int y = 2;
unsigned char pixel = pixels[(y*((int)whiteImage.size.width))+x];

对于RGBA值,基本原理和上面的灰度值一样,但是需要注意的一点是,RGBA值需要四个字节来去表示一个像素。

int x = 10;
int y = 2;
unsigned char pixel = pixels[(y*((int)whiteImage.size.width)*4)+(x*4)];

如果你看到了这里,那就说明你已经能够从UIImage中获取像素信息了,Congratulations! 但是,最后有一点非常重要的事情你需要注意。你使用完这些方法给你的数据之后,你需要手动的去free这些数据,否则就会出现内存泄露。可能有些人会疑惑我为什么把返回值设定为(unsigned char*)而不是一个NSArray,答案很简单,直接操作(unsigned char*)要比操作NSArray快很多,而我的方法默认是为那些对操作速度要求很高的同学提供的。

时间: 2024-07-30 09:12:39

objective-c中如何从UIImage中获取像素信息的相关文章

Android之QQ授权登录获取用户信息

有时候我们开发的app须要方便用户简单登录.能够让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下怎样在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开腾讯开发平台这个网页,点击---->移动应用---->创建应用,成功创建应用后.能够产生我们须要的App ID和App Key,例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVhcl9odWFuZ3poZW4=/font/5a6

C# Winform中执行post操作并获取返回的XML类型的数据

/// <summary> /// 返回指定日期的订单数据 /// </summary> /// <param name="StartDate">起始日期</param> /// <param name="EndDate">结束日期</param> /// <returns>DataTable</returns> public System.Data.DataTable

iOS利用HealthKit框架从健康app中获取步数信息

微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食. 统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为我们统计好了步数数据 我们只要使用HealthKit框架从健康app中获取这个数据信息就可以了 这篇文章对HealthKit框架进行了简单的介绍:http://www.cocoachina.com/ios/20140915/9624.html 对HealthKit框架有了简单的了解后我们就可以开始了

jQuery遍历table中的tr td并获取td中的值

jQuery遍历table中的tr td并获取td中的值 $(function(){ $("#tableId tr").find("td").each(function(){ <span style="white-space:pre"> </span> var year = $("#year").val(); var month = $("#month").val(); var da

微信商城中使用微信支付接口获取用户地址

授人以鱼不如授人以渔 微信支付获取用户地址 使用微信获取地址信息是和微信支付一道申请的,微信支付申请通过,就可以使用该功能. 微信商城中,使用微信支付获取用户的收货地址,可以省略用户输入地址信息的繁复流程,提高用户体验. 但是可能是因为牵扯到用户隐私,所以在使用过程中,需要用户自己主动选择使用该功能,并且是通过点击的操作,我们才可以获取到用户的收货地址,这一点是要注意的. 操作流程如下: 1.用户打开购物车页面,点击结算,跳转到一个微信的oauth2的页面,地址为:https://open.we

C#中的bitmap类和图像像素值获取方法

一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色. 2. PixelFormat属性:返回图像的像素格式. 3. Palette属性:获取和设置图像所使用的颜色调色板. 4. Height Width属性:返回图像的高度和宽度. 5. LockBits方法和UnlockBits

Android——使用Volley+fastJson在新线程中读取网络接口获取天气信息

一,关于Volley 其实最初对于网络数据的访问,我是没想到要用框架的,使用HttpURLConnection或者HttpGet or HttpPost都可以实现.但是why? why I have to use Volley?   Before Volley: class HttpURLConnection_post extends Thread{ @Override public void run() { //设置请求的路径 String strUrl="http://api.qingyun

js获取url中的参数,并保证获取到的参数不乱码

  //网上比较经典的js获取url中的参数的方法  function getQueryString(name) {      var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");      var r = window.location.search.substr(1).match(reg);      if ( r != null ){        

H264裸流分析中,能获取哪些信息?

从H264的裸流中,PPS,SPS中,一定可以获取到的,有图像的宽,高信息. 这部分信息的提取,用Stream eye 分析: 这里需要特别提一下这两个参数:  pic_width_in_mbs_minus1 = 119(1920)  pic_height_in_map_units_minus1 = 67(1088)分别表示图像的宽和高,以宏块(16x16)为单位的值减1因此,实际的宽为 (119+1)*16 = 352,高:(67+1)*16=1088 开始的时候,我还以为是哪里不对,1080