从图像中检索RGBA值

时间:2013-04-18 15:44:28

标签: iphone ios objective-c core-graphics bitmapdata

我使用 CGDataProviderCopyData 从Image中检索数据,但与图像文件大小相比,此函数返回的字节非常大。这是我的代码。

UIImage *image = self.imageView.image;
CGImageRef cgimage = image.CGImage;
CGDataProviderRef provider = CGImageGetDataProvider(cgimage);
NSData* data = (__bridge_transfer NSData*)CGDataProviderCopyData(provider);

是否有其他方法可以读取像素数据并从图像中获取rgba值。

2 个答案:

答案 0 :(得分:1)

这是找到值的方法......

 CGImageRef imgSource=self.duplicateImage.image.CGImage;
    CFDataRef m_DataRef1 = CGDataProviderCopyData(CGImageGetDataProvider(imgSource)); 
    UInt8 *dataOriginal=(UInt8 *)CFDataGetBytePtr(m_DataRef1);
    double lengthSource=CFDataGetLength(m_DataRef1);
    NSLog(@"length::%f",lengthSource);

下面是一个修改值的例子......

   -(UIImage*)customBlackFilterOriginal
{
    CGImageRef imgSource=self.duplicateImage.image.CGImage;
    CFDataRef m_DataRef1 = CGDataProviderCopyData(CGImageGetDataProvider(imgSource)); 
    UInt8 *dataOriginal=(UInt8 *)CFDataGetBytePtr(m_DataRef1);
    double lengthSource=CFDataGetLength(m_DataRef1);
    NSLog(@"length::%f",lengthSource);
    int redPixel;
    int greenPixel;
    int bluePixel;

    for(int index=0;index<lengthSource;index+=4)
    {

        dataOriginal[index]=dataOriginal[index];
        dataOriginal[index+1]= 101;
        dataOriginal[index+2]= 63;
        dataOriginal[index+3]=43;      

    } 

    NSUInteger width =CGImageGetWidth(imgSource);
    size_t height=CGImageGetHeight(imgSource);
    size_t bitsPerComponent=CGImageGetBitsPerComponent(imgSource);
    size_t bitsPerPixel=CGImageGetBitsPerPixel(imgSource);
    size_t bytesPerRow=CGImageGetBytesPerRow(imgSource);

    NSLog(@"the w:%u H:%lu",width,height);

    CGColorSpaceRef colorspace=CGImageGetColorSpace(imgSource);
    CGBitmapInfo bitmapInfo=CGImageGetBitmapInfo(imgSource);
    CFDataRef newData=CFDataCreate(NULL,dataOriginal,lengthSource);
    CGDataProviderRef provider=CGDataProviderCreateWithCFData(newData);
    CGImageRef newImg=CGImageCreate(width,height,bitsPerComponent,bitsPerPixel,bytesPerRow,colorspace,bitmapInfo,provider,NULL,true,kCGRenderingIntentDefault);

    return [UIImage imageWithCGImage:newImg];

}

答案 1 :(得分:0)

你在做什么是正确的。磁盘上的映像文件采用压缩格式。将数据加载到UIImage时,图像将被解压缩并采用“width x height x 4”字节。 “4”假定为RGBA。实际上数据可能会更大一些,因为每行的字节数通常是16字节的倍数。

关于从图像加载字节的一件事。不要以为它是RGBA。根据图像,它可以是其他格式。使用适当的函数来确定颜色模型,每像素字节数和每行字节数。