- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试为我的 iOS 应用构建图像捕获,但我的 CGImage 结果总是出现颜色失真。这是相机预览,正确的颜色。
可乐是红色的,一切都好。
当我运行我的快照代码时,我得到了这个:
可乐是蓝色的……这是从哪里来的?
我尝试弄乱一些参数,但最终根本得不到任何图像。这是我的快照代码:
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = [cameraVideo bufRowBytes];
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, [cameraVideo bufDataPtr], [cameraVideo bufWidth]*[cameraVideo bufHeight]*4, NULL);
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipLast;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentPerceptual;
CGImageRef imageRef = CGImageCreate( [cameraVideo bufWidth], [cameraVideo bufHeight], bitsPerComponent, bitsPerPixel,
bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
我无能为力,所以如果有人看到我做错了什么,请告诉我。
已修复
这是最终代码:
if (cameraVideo.ARPixelFormat == kCVPixelFormatType_32ARGB) {
bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipFirst;
} else {
bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;
}
最佳答案
看起来您的 R(红色)和 B(蓝色) channel 已互换。相机正在按 BGR 顺序填充缓冲区,但你告诉 CGImage
数据在 RGB
中命令。我相信您可以使用 kCGBitmapByteOrder...
之一来控制它CGBitmapInfo
中的常量.尝试设置 bitmapInfo
像这样:
CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big;
如果这不起作用,请尝试另一个 kCGBitmapByteOrder...
常量( kCGBitmapByteOrder32Little
、 kCGBitmapByteOrder16Big
、 kCGBitmapByteOrder16Little
)。
Apple 的 SquareCam 示例项目有一个名为 SquareCam/SqareCamViewController.m
的文件(是的,文件名中的“Square”拼写错误)。它包含以下代码:
sourcePixelFormat = CVPixelBufferGetPixelFormatType( pixelBuffer );
if ( kCVPixelFormatType_32ARGB == sourcePixelFormat )
bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipFirst;
else if ( kCVPixelFormatType_32BGRA == sourcePixelFormat )
bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;
else
return -95014; // only uncompressed pixel formats
您可能想做同样的事情。
关于iphone - CGImageCreate 中的颜色失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9920836/
我正在尝试在内存中创建位图作为 drawLayer:inContext: 方法(此方法是 CALayer 委托(delegate)协议(protocol)的一部分)将调用的模式函数的一部分。模式函数看
我以基于列的格式存储图像数据,并尝试使用 CGImageCreate 直接绘制它。 对于 3x3 渲染图像: A B C D E F G H I 数据存储在列中,从下到上: data[] = { G,
一段时间以来,我一直在尝试执行以下操作, 玩家点击屏幕 获取玩家点击的像素值 遍历图像以找出哪些像素相同 Make all 具有相同值的像素的 alpha 为 0 创建新图像并 将 UIImage 设
我正在尝试为我的 iOS 应用构建图像捕获,但我的 CGImage 结果总是出现颜色失真。这是相机预览,正确的颜色。 可乐是红色的,一切都好。 当我运行我的快照代码时,我得到了这个: 可乐是蓝色的……
我正在尝试为 iOS 5.1 设备创建一个 UIImage 测试模式。目标 UIImageView 的大小为 320x240,但我试图创建一个 160x120 的 UIImage 测试模式( futu
有时图像非常大(从互联网下载),所以我需要调整它们的大小但不想引起内存问题这意味着我不想将所有图像数据加载到内存并在内存。 我正在研究多种调整图像大小的方法,监控它们的内存使用情况。具体来说,CGCo
我正在尝试将图像像素绘制到图形上下文中以迭代和打印图像的色彩空间信息值。我设法缓冲了所有原始像素值。但是我尝试使用 CGImageCreate 绘制位图图像时遇到了以下错误,也是 screenshot
A CGImageRef 似乎没有任何变异操作。复制 CGImageRef 不会复制 CGDataProviderRef(通过实验确定)。因此,如果 CGImageRef 是不可变类型,是否有任何理由
我将 opencv 与 Xcode 一起使用,我得到了从 IplImage 转换为 UIImage 的方法: -(UIImage *)UIImageFromIplImage:(IplImage *)i
在过去的 4 到 5 个小时里,我一直在努力解决这个非常奇怪的问题。我有一个字节数组,其中包含我想要制作图像的像素值。该数组代表每个组件 32 位的值。没有 Alpha channel ,因此图像为
我在通用项目中使用 iOS 6 时收到此错误 ("CGImageCreate: invalid image size: 0 x 0"),仅适用于新的 iPad 模拟器(不适用于旧的或 iPhone)如
我的快速查看生成器以前可以正常工作,但现在坏了。 这是一个错误还是我做错了什么? 这是我的代码: OSStatus GeneratePreviewForURL(void *thisInterface,
我是一名优秀的程序员,十分优秀!