我使用 CGDataProviderCopyData 从Image中检索数据,但与图像文件大小相比,此函数返回的字节非常大。这是我的代码。
UIImage *image = self.imageView.image;
CGImageRef cgimage = image.CGImage;
CGDataProviderRef provider = CGImageGetDataProvider(cgimage);
NSData* data = (__bridge_transfer NSData*)CGDataProviderCopyData(provider);
是否有其他方法可以读取像素数据并从图像中获取rgba值。
答案 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。根据图像,它可以是其他格式。使用适当的函数来确定颜色模型,每像素字节数和每行字节数。