获取图片每(某)个像素点的RBGA值
2015-08-25 14:41
274 查看
最近项目有个需求,获取调色板上某个点的RBGA值,来设置背景颜色。查找了一些资料,经过多次测试,最终拿到的RGBA值基本一致(这里为什么说基本一致呢,如果RGBA值的取值范围在0~255之间的话,结果会有1-2个点的误差)。方法如下:
获取图片上某个点的RGBA值
获取图片每个像素点的RGBA值
//获取图片每个像素点的RGBA值
- (NSMutableArray *)getImagePixel:(UIImage *)image point:(CGPoint)aPoint {
// Create array to add all files into total image
NSMutableArray *byteArray = [[NSMutableArray alloc] initWithCapacity:(image.size.width * image.size.height)];
CGImageRef cgimage = image.CGImage;
size_t width = CGImageGetWidth(cgimage);
size_t height = CGImageGetHeight(cgimage);
size_t bpr = CGImageGetBytesPerRow(cgimage); //每行的字节数
size_t bpp = CGImageGetBitsPerPixel(cgimage); //每个像素的位数
size_t bpc = CGImageGetBitsPerComponent(cgimage); //每个字节的组成部分
size_t bytes_per_pixel = bpp / bpc;
// Get CGDataProviderRef from cgimage
CGDataProviderRef provider = CGImageGetDataProvider(cgimage);
@autoreleasepool
{
//Using (__bridge_transfer NSData *) casts the provider to type NSData and gives ownership to ARC, but still not discarded
NSData *data = (__bridge_transfer NSData *)CGDataProviderCopyData(provider);
const UInt8 *bytes = (Byte *)[data bytes];
// Populate byte array with channel data from each pixel
for(size_t row = 0; row < height; row++) {
for(size_t col = 0; col < width; col++) {
const UInt8* pixel = &bytes[row * bpr + col * bytes_per_pixel];
for(unsigned short i = 0; i < 4; i+=4) {
unsigned short red = pixel[i]; // red channel
unsigned short green = pixel[i+1]; // green channel
unsigned short blue = pixel[i+2]; // blue channel
unsigned short alpha = pixel[i+3]; // alpha channel
[byteArray addObject:@(red)];
[byteArray addObject:@(green)];
[byteArray addObject:@(blue)];
[byteArray addObject:@(alpha)];
}
}
}
data = nil;
}
return byteArray;
}
获取图片上某个点的RGBA值
//获取图片某个点的RGBA值 - (NSMutableArray *)getImagePixel:(UIImage *)image point:(CGPoint)aPoint { NSMutableArray *byteArray = [[NSMutableArray alloc] initWithCapacity:10]; CGImageRef cgimage = image.CGImage; size_t scale = CGImageGetWidth(cgimage) / image.size.width; size_t bpr = CGImageGetBytesPerRow(cgimage); //每行的字节数 size_t bpp = CGImageGetBitsPerPixel(cgimage); //每个像素的位数 size_t bpc = CGImageGetBitsPerComponent(cgimage); //每个字节的组成部分 size_t bytes_per_pixel = bpp / bpc; // Get CGDataProviderRef from cgimage CGDataProviderRef provider = CGImageGetDataProvider(cgimage); @autoreleasepool { //Using (__bridge_transfer NSData *) casts the provider to type NSData and gives ownership to ARC, but still not discarded NSData *data = (__bridge_transfer NSData *)CGDataProviderCopyData(provider); const UInt8 *bytes = (Byte *)[data bytes]; size_t row = aPoint.y*scale; size_t col = aPoint.x*scale; const UInt8* pixel = &bytes[row * bpr + col * bytes_per_pixel]; for(unsigned short i = 0; i < 4; i+=4) { unsigned short red = pixel[i]; // red channel - unused unsigned short green = pixel[i+1]; // green channel unsigned short blue = pixel[i+2]; // blue channel unsigned short alpha = pixel[i+3]; // alpha channel - unused [byteArray addObject:@(red)]; [byteArray addObject:@(green)]; [byteArray addObject:@(blue)]; [byteArray addObject:@(alpha)]; } data = nil; } return byteArray; }
获取图片每个像素点的RGBA值
//获取图片每个像素点的RGBA值
- (NSMutableArray *)getImagePixel:(UIImage *)image point:(CGPoint)aPoint {
// Create array to add all files into total image
NSMutableArray *byteArray = [[NSMutableArray alloc] initWithCapacity:(image.size.width * image.size.height)];
CGImageRef cgimage = image.CGImage;
size_t width = CGImageGetWidth(cgimage);
size_t height = CGImageGetHeight(cgimage);
size_t bpr = CGImageGetBytesPerRow(cgimage); //每行的字节数
size_t bpp = CGImageGetBitsPerPixel(cgimage); //每个像素的位数
size_t bpc = CGImageGetBitsPerComponent(cgimage); //每个字节的组成部分
size_t bytes_per_pixel = bpp / bpc;
// Get CGDataProviderRef from cgimage
CGDataProviderRef provider = CGImageGetDataProvider(cgimage);
@autoreleasepool
{
//Using (__bridge_transfer NSData *) casts the provider to type NSData and gives ownership to ARC, but still not discarded
NSData *data = (__bridge_transfer NSData *)CGDataProviderCopyData(provider);
const UInt8 *bytes = (Byte *)[data bytes];
// Populate byte array with channel data from each pixel
for(size_t row = 0; row < height; row++) {
for(size_t col = 0; col < width; col++) {
const UInt8* pixel = &bytes[row * bpr + col * bytes_per_pixel];
for(unsigned short i = 0; i < 4; i+=4) {
unsigned short red = pixel[i]; // red channel
unsigned short green = pixel[i+1]; // green channel
unsigned short blue = pixel[i+2]; // blue channel
unsigned short alpha = pixel[i+3]; // alpha channel
[byteArray addObject:@(red)];
[byteArray addObject:@(green)];
[byteArray addObject:@(blue)];
[byteArray addObject:@(alpha)];
}
}
}
data = nil;
}
return byteArray;
}
相关文章推荐
- 士兵调用枪的问题
- python 流程控制
- PAT 1091. Acute Stroke (30)
- Android FragmentManager BackStackRecord.run throwing NullPointerException
- 第5章 跳跃表
- application/x-www-form-urlencoded等字符编码的解释说明(http)
- 微软小冰智能聊天是如何实现的?
- 即时通讯 聊天界面 listview 中 所有的语音的列表
- Tomcat启用SSL导致Firefox出现“安全连接失败”错误的解决方法
- C++中编译预处理功能
- HTML学习03
- mysql 中的升序和降序 .
- 设计模式
- svn笔记
- 规则引擎 visualrules 开发基础教程【连载1】-- 概述篇
- 解决 eclipse 上 Keystore was tampered with, or password was incorrect
- Android studio无法创建新项目问题解决方案一
- String相关
- Android 4.4 源码编译
- 二分图算法 知识点详解