Swift和Objective-C应用程序中不同的UIImage RGB数据输出

问题描述

我正在研究图像处理框架,并使用此代码读取RGB数据:

if let data = image.cgImage?.dataProvider?.data {           
  let dataPtr: UnsafePointer<UInt8> = CFDataGetBytePtr(data)
  let width = Int(image.size.width)
  let height = Int(image.size.height)
  for y in 0..<height {
    for x in 0..<width {
      let pixelInfo: Int = ((width * y) + x) * 4
      let r = dataPtr[pixelInfo]
      let g = dataPtr[pixelInfo + 1]
      let b = dataPtr[pixelInfo + 2]
      print("\(r),\(g),\(b)")
    }
  }
}

如果我创建新的Swift项目和新的Objective-C项目并使用相同的代码(对于Objc项目使用桥头文件),则会得到不同的结果,例如:

5,36,20;   24,69,48 (Swift)
5,18;   21,47 (Objc)

在进一步处理中会导致不同的结果。我试图使用Objective-C代码并使用CGBitmapContextCreate()读取数据,但得到的结果完全相同。它在两个应用程序中都显示相同的ColorSpace,我尝试将其手动设置为DeviceRGB和sRGB,但没有任何运气。

我必须将Objc输出与具有与Swift应用完全相同的结果的Android应用相匹配。

更新。 我尝试过的第二个解决方案是为Objective-C写另一个代码,它返回与Swift不匹配的完全相同的结果:

size_t bytesSize = 0;
unsigned char *bytes = [self getBytesFromImage:image dataSize:&bytesSize];

size_t doubleSize = sizeof(double) * bytesSize;
double *doubles = (double *)malloc(doubleSize);

size_t doublesIndex = 0;
size_t counter = 0;
while (counter < bytesSize) {
    unsigned char r = bytes[counter];
    unsigned char g = bytes[counter+1];
    unsigned char b = bytes[counter+2];
    counter += 4;
}

- (unsigned char*) getBytesFromImage:(UIImage *)image dataSize:(size_t *)dataSize {
    *dataSize = size_t(4 * image.size.width * image.size.height);
    unsigned char *imageData = (unsigned char*)malloc(*dataSize);
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
    CGImageRef imageRef = [image CGImage];
    CGContextRef bitmap = CGBitmapContextCreate( imageData,image.size.width,image.size.height,8,image.size.width * 4,colorSpace,kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(bitmap,CGRectMake(0,image.size.height),imageRef);
    
    CGContextRelease(bitmap);
    CGColorSpaceRelease(colorSpace);
    
    return imageData;
}

解决方法

根据您的Swift代码,我对您看到的内容进行了编码。

我使用了您的代码,并且此代码似乎完美匹配-至少对于我正在使用此面的图像而言。

// Dump some bytes
- ( void ) test
{
    UIImage * img = [UIImage imageNamed:@"test"];
    CGDataProviderRef dp = CGImageGetDataProvider( img.CGImage );
    CFDataRef data = CGDataProviderCopyData ( dp );
    CFIndex length = CFDataGetLength ( data );
    NSUInteger i = 0;
    unsigned char rgba [ 4 ];

    // Print all
    // while ( i < length )
    // Print first few
    while ( i < 100 )
    {
        CFDataGetBytes( data,CFRangeMake( i,sizeof( rgba ) ),rgba );
        i += 4;

        NSLog ( @"RGB %d %d %d",rgba[ 0 ],rgba[ 1 ],rgba[ 2 ] );
    }
    CFRelease ( data );
    CGDataProviderRelease ( dp );
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...