1

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

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

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

4

2 回答 2

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];

}
于 2013-04-19T08:54:41.627 回答
0

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

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

于 2013-04-18T16:08:27.540 回答