结合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
低于objective-c
中的错误结果。您可以看到它与swift
相比非常像素化。这款手机是iPhone 6s。
我错过了什么或做错了什么?
答案 0 :(得分:1)
我正在尝试显示
RGB
字节数组
然后kCGImageAlphaPremultipliedLast
不正确。尝试切换到kCGImageAlphaNone
。
答案 1 :(得分:1)
我发现了我的问题。事实证明它与图像本身无关。有一个错误,width
的值(height
和500
)不适合uint8_t
。这就是图像显示较小的原因。非常愚蠢。将其更改为正确的值。