IOS取图片的某个位置的像素(ARGB…

//
//  cUIImageData.h
//  HelloWorld
//
//  Created by apple on 13-10-3.
//  Copyright (c) 2013年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
typedef struct {
      Byte A;
      Byte R;
      Byte G;
      Byte B;
}Color;

@interface cUIImageData : NSObject
-(Byte*)getImageData:(UIImage*)Image;
-(Color)GetImageColorAtPointX:(int)X
                                            PointY:(int)Y
                                      FromImage:(Byte*)ImageData
                                  OfImageSize:(CGSize)ImageSize;
@end


//
//  cUIImageData.m
//  HelloWorld
//
//  Created by apple on 13-10-3.
//  Copyright (c) 2013年 apple. All rights reserved.
//

#import "cUIImageData.h"

@implementation cUIImageData
//将UIimage中的数据放入Byte数组中,顺序为ARGB.
-(Byte*)getImageData:(UIImage*)Image{
      CGImageRef imageRef= [Image CGImage];
      CGColorSpaceRef colorSpace = CGColorSpaceCreateDevice RGB();
     
      int width = CGImageGetWidth(imageRef);
      int height = CGImageGetHeight(imageRef);
      int bytesPerPixel = 4;
      int bytesPerRow=bytesPerPixel*width;
      int bitsPerComponent = 8;
     
      void* imageData ;//准备用来存储数据的数组

      CGContextRef cgContexRef = CGBitmapContextCreate(NULL,
                                                                                                        width,
                                                                                                        height,
                                                                                                        bitsPerComponent,
                                                                                                        bytesPerRow,
                                                                                                        colorSpace,
                                                                      kCGImageAlphaPremultipli edFirst);

      CGRect theRect = CGRectMake(0,0, width, height);
      CGContextDrawImage(cgContexRef, theRect, imageRef);
     
      //Byte* tempData=(Byte*)CGBitmapContextGetData(cgContexRef);
      CGColorSpaceRelease(colorSpace);

      imageData = new Byte[4*(width-1)+4*(height-1)*width+3];
      memcpy(imageData, (Byte*)CGBitmapContextGetData(cgContexRef), 4*(width-1)+4*(height-1)*width+3);
    //把data做一个深度拷贝,因为原来的数据在cgContexRef里边,要释放,要不会杯具
      CGContextRelease(cgContexRef);
     
     
      return (Byte*)imageData;
}

-(Color)GetImageColorAtPointX:(int)X
                                            PointY:(int)Y
                                            FromImage:(Byte*)ImageData
                                        OfImageSize:(CGSize)ImageSize{
      int index =4*X+4*Y*ImageSize.width;//每个像素由四个分量组成所以要乘以4
      Color c;//不是指针不用主动分配内存=。=
      c.A=ImageData [index];
      c.R=ImageData[index+1];
      c.G=ImageData[index+2];
      c.B=ImageData[index+3];
      return c;
}

@end
///

函数原型:

CGContextRef CGBitmapContextCreate (

    void *data,
    size_t width,
    size_t height,
    size_t bitsPerComponent,
    size_t bytesPerRow,
    CGColorSpaceRef colorspace,
    CGBitmapInfo bitmapInfo

);

参数:

data                                    指向要渲染的绘制内存的地址。这个内存块的大小至少是(bytesPerRow*height)个字节,在ios4.0或者OSX10.6以后可以直接用NULL表示自动分配内存块大小。

width                                  bitmap的宽度,单位为像素

height                                bitmap的高度,单位为像素

bitsPerComponent        内存中像素的每个组件的位数.例如,对于32位像素格式和RGB 颜色空间,你应该将这个值设为8.

bytesPerRow                  bitmap的每一行在内存所占的比特数

colorspace                      bitmap上下文使用的颜色空间。

bitmapInfo                       指定bitmap是否包含alpha通道,像素中alpha通道的相对位置,像素组件是整形还是浮点型等信息的字符串。

描述:

当你调用这个函数的时候,Quartz创建一个位图绘制环境,也就是位图上下文。当你向上下文中绘制信息时,Quartz把你要绘制的信息作为位图 数据绘制到指定的内存块。一个新的位图上下文的像素格式由三个参数决定:每个组件的位数,颜色空间,alpha选项。alpha值决定了绘制像素的透明性。

///bitmapInfo详细

CS

BPC

alphaInfo

Resulting Bits and Description

NULL

8

kCGImageAlphaOnly

AAAAAAAA 8 bits per pixel alpha-only destination. Color data is thrown away. Useful for generating alpha-only bitmaps and masks. Available in Mac OS X 10.3 and later.

Gray

8

kCGImageAlphaNone

WWWWWWWW 8 bits per pixel grayscale channel.

RGB

5

kCGImageAlphaNoneSkipFirst

-RRRRRGGGGGBBBBB 16 bits per pixel, 5 bits per RGB component.

RGB

8

kCGImageAlphaNoneSkipFirst

--------RRRRRRRRRGGGGGGGGBBBBBBBB 32 bits per pixel, 8 bits per RGB component where first 8 bits are ignored.

RGB

8

kCGImageAlphaNoneSkipLast

RRRRRRRRRGGGGGGGGBBBBBBBB-------- 32 bits per pixel, 8 bits per RGB component where last 8 bits are ignored.

RGB

8

kCGImageAlphaPremultipliedFirst

AAAAAAAARRRRRRRRRGGGGGGGGBBBBBBBB 32 bits per pixel, 8 bits per ARGB component with premultiplied alpha.

RGB

8

kCGImageAlphaPremultipliedLast

RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA 32 bits per pixel, 8 bits per RGBA component with premultiplied alpha.


//用例
      cUIImageData* cud=[[cUIImageData alloc]init];
      Byte* data = [cud getImageData:img];
      Color colorAt00=[cud GetImageColorAtPointX:0
                                                                    PointY:0
                                                              FromImage:data OfImageSize:CGSizeMake(588, 588)];
      Byte a=data[0];
      Byte b=data[1];
      Byte cc=data[2];
      Byte d =data[3];
      if(a==255)
              cout<<a-colorAt00.A<<endl;
      else
              cout<<"No"<<endl;
     
      cout<<a<<endl
      <<b<<endl
      <<(int)cc<<endl
      <<(int)d<<endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值