核心ML:来自RGBA字节阵列的UIImage未完全显示

时间:2018-04-05 06:23:53

标签: ios objective-c swift

结合Core ML,我尝试使用以下代码在RGBA byte array中显示UIImage

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(bytes, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast);
CFRelease(colorSpace);

CGImageRef cgImage = CGBitmapContextCreateImage(context);
CGContextRelease(context);

UIImage *image = [UIImage imageWithCGImage:cgImage scale:0 orientation:UIImageOrientationUp];
CGImageRelease(cgImage);

dispatch_async(dispatch_get_main_queue(), ^{
    [[self predictionView] setImage:image];
});

我像这样创建图像数据:

 uint32_t offset = h * width * 4 + w * 4;
 struct Color rgba = colors[highestClass];
 bytes[offset + 0] = (rgba.r);
 bytes[offset + 1] = (rgba.g);
 bytes[offset + 2] = (rgba.b);
 bytes[offset + 3] = (255 / 2); // semi transparent

图片大小为500px 500px。但是,未显示完整图像,看起来图像显示为50%放大。

我开始搜索此问题,并发现其他人也有同样的问题。这就是为什么我决定编辑StoryBoard并为Content Mode设置不同的值,目前我使用Aspect Fit。但结果仍然相同。

我还尝试在图像中心绘制一条水平线,以显示图像放大了多少。它确认图像放大了50%

我在swift中编写了相同的代码,工作正常。请参阅swift此处的代码和结果:

let offset = h * width * 4 + w * 4
let rgba = colors[highestClass]
bytes[offset + 0] = (rgba.r)
bytes[offset + 1] = (rgba.g)
bytes[offset + 2] = (rgba.b)
bytes[offset + 3] = (255/2) // semi transparent

let image = UIImage.fromByteArray(bytes, width: width, height: height,
               scale: 0, orientation: .up,
               bytesPerRow: width * 4,
               colorSpace: CGColorSpaceCreateDeviceRGB(),
               alphaInfo: .premultipliedLast)

https://github.com/hollance/CoreMLHelpers/blob/master/CoreMLHelpers/UIImage%2BCVPixelBuffer.swift

enter image description here

低于objective-c中的错误结果。您可以看到它与swift相比非常像素化。这款手机是iPhone 6s。

我错过了什么或做错了什么?

iPhone 6s screenshot

XCode screenshot

2 个答案:

答案 0 :(得分:1)

  

我正在尝试显示RGB字节数组

然后kCGImageAlphaPremultipliedLast不正确。尝试切换到kCGImageAlphaNone

答案 1 :(得分:1)

我发现了我的问题。事实证明它与图像本身无关。有一个错误,width的值(height500)不适合uint8_t。这就是图像显示较小的原因。非常愚蠢。将其更改为正确的值。