我的应用有几种方法部分基于this article。
我需要在某个位置找到颜色的图片可能来自相机,库,应用包或应用中生成的颜色。我刚遇到一个问题,其中通道的顺序是不同的(不同的是由应用程序生成的并以jpeg格式保存以用于缓存目的)。
所以我的问题是,如何,最好使用链接作为起点,我可以确定CGImage的颜色顺序吗?我确定这是在某处记录的,但在哪里?
使用我称之为+ imageDump的方法,受this article启发,我从一张图片中提取以下信息:
CGImageGetHeight: 120
CGImageGetWidth: 120
CGImageGetColorSpace: <CGColorSpace 0x1c562050> (kCGColorSpaceDeviceRGB)
CGImageGetBitsPerPixel: 32
CGImageGetBitsPerComponent: 8
CGImageGetBytesPerRow: 480
CGImageGetBitmapInfo: 0x00002002
kCGBitmapAlphaInfoMask = YES
kCGBitmapFloatComponents = NO
kCGBitmapByteOrderMask = YES
kCGBitmapByteOrderDefault = NO
kCGBitmapByteOrder16Little = NO
kCGBitmapByteOrder32Little = YES
kCGBitmapByteOrder16Big = YES
kCGBitmapByteOrder32Big = NO
并从另一张图片中,通道的顺序不同:
CGImageGetHeight: 120
CGImageGetWidth: 120
CGImageGetColorSpace: <CGColorSpace 0x1c562050> (kCGColorSpaceDeviceRGB)
CGImageGetBitsPerPixel: 32
CGImageGetBitsPerComponent: 8
CGImageGetBytesPerRow: 480
CGImageGetBitmapInfo: 0x00000001
kCGBitmapAlphaInfoMask = YES
kCGBitmapFloatComponents = NO
kCGBitmapByteOrderMask = NO
kCGBitmapByteOrderDefault = NO
kCGBitmapByteOrder16Little = NO
kCGBitmapByteOrder32Little = NO
kCGBitmapByteOrder16Big = NO
kCGBitmapByteOrder32Big = NO
似乎这些信息以某种方式指定了频道顺序,但我不知道如何解释这些常量。或者我看错了什么?
答案 0 :(得分:2)
我发布这个答案主要是为了回答我的问题的评论。这是我使用的解决方案:
- (UIColor*)colorFromImage:(UIImage*)image sampledAtPoint:(CGPoint)p {
// from http://stackoverflow.com/questions/144250/how-to-get-the-rgb-values-for-a-pixel-on-an-image-on-the-iphone
//DLog(@"Image dump call from colorFromImage:sampledAtPoint:");
//[Utilities imageDump:image];
int radius = 3;
CGImageRef cgImage = [image CGImage];
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef bitmapData = CGDataProviderCopyData(provider);
const UInt8* data = CFDataGetBytePtr(bitmapData);
size_t bytesPerRow = CGImageGetBytesPerRow(cgImage);
size_t width = CGImageGetWidth(cgImage);
size_t height = CGImageGetHeight(cgImage);
CGBitmapInfo info = CGImageGetBitmapInfo(cgImage);
long col = p.x*(width-1);
long row = p.y*(height-1);
long cnt = 0;long redval=0,greenval=0,blueval=0;
for (int rrow = row - radius; rrow < row + radius; rrow++) {
for (int ccol = col - radius; ccol < col + radius; ccol++) {
if ((rrow >= 0) && (ccol >= 0)) {
if ((rrow < height) && (ccol < width)) {
const UInt8* pixel = data + rrow*bytesPerRow+ccol*4;
int tempred,tempgreen,tempblue,tempalpha;
if (info & kCGBitmapByteOrder32Little) {
tempred = pixel[2];
tempgreen = pixel[1];
tempblue = pixel[0];
tempalpha = pixel[3];
} else {
tempred = pixel[0];
tempgreen = pixel[1];
tempblue = pixel[2];
tempalpha = pixel[3];
}
//DLog(@"%d %d %d %d",tempred,tempgreen,tempblue,tempalpha);
if (tempalpha==255) {
redval += tempred;
greenval += tempgreen;
blueval += tempblue;
cnt++;
}
}
}
}
}
UIColor *returnColor = [UIColor colorWithRed:1.0f*redval/(cnt*255) green:1.0f*greenval/(cnt*255) blue:1.0f*blueval/(cnt*255) alpha:1.0];
CFRelease(bitmapData);//take care of memory leak
return returnColor;
}
我似乎记得它不是一个完整的解决方案,但足以满足我自己的目的。
答案 1 :(得分:1)
您需要使用CGImageGetAlphaInfo
,CGImageGetBitmapInfo
,CGImageGetBitsPerComponent
和CGImageGetBitsPerPixel
函数来确定数据的布局。这些值的组合将允许您确定哪些组件,它们的大小和顺序。