Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何从CVPixelBuffer中删除alpha通道并在Swift中获取其数据_Ios_Swift_Image Processing_Alpha - Fatal编程技术网

Ios 如何从CVPixelBuffer中删除alpha通道并在Swift中获取其数据

Ios 如何从CVPixelBuffer中删除alpha通道并在Swift中获取其数据,ios,swift,image-processing,alpha,Ios,Swift,Image Processing,Alpha,我的CVPixelBuffer以kCVPixelFormatType_32BGRA的形式出现,我正在尝试以BGR格式获取没有Alpha通道的帧数据。以下是我尝试做的(作为扩展CVPixelBuffer) 但是获得的缓冲区似乎不正确。实现这一目标的最佳方式是什么?提前感谢您的代码只分配新的数据结构,但显然不会通过丢弃最后一个Alpha字节将4字节“压缩”为3字节 使第一个像素(在源中)的Alpha字节成为第二个像素(在目标中)的蓝色字节,依此类推: S:BGRABGRABGRA D:bgrbgrb

我的CVPixelBuffer以kCVPixelFormatType_32BGRA的形式出现,我正在尝试以BGR格式获取没有Alpha通道的帧数据。以下是我尝试做的(作为扩展CVPixelBuffer)


但是获得的缓冲区似乎不正确。实现这一目标的最佳方式是什么?提前感谢

您的代码只分配新的数据结构,但显然不会通过丢弃最后一个Alpha字节将4字节“压缩”为3字节

使第一个像素(在源中)的Alpha字节成为第二个像素(在目标中)的蓝色字节,依此类推:

S:BGRABGRABGRA


D:bgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrbgrb

我没有检查此代码中是否有任何错误、try/catch语句、无保护等。您需要确保代码是防错的

让我们首先定义我们的BGRA颜色格式。因为我们有4个通道,所以每个像素需要32位。我们还定义alpha通道是最后一位

var bgraSourceFormat=vImage\u CGImageFormat(
比特组件:8,
比特像素:32,
colorSpace:Unmanaged.passRetained(CGColorSpaceCreateDeviceRGB()),
bitmapInfo:CGBitmapInfo(rawValue:CGImageAlphaInfo.last.rawValue),
版本:0,
解码:无,
renderingIntent:.defaultIntent
)
现在我们可以定义BGR格式。我们需要3个通道,所以每个像素24位就足够了。我们还定义此格式将不具有alpha通道

var bgrDestinationFormat=vImage\u CGImageFormat(
比特组件:8,
比特像素:24,
颜色空间:零,
bitmapInfo:CGBitmapInfo(rawValue:CGImageAlphaInfo.none.rawValue),
版本:0,
解码:无,
renderingIntent:.defaultIntent
)
并创建转换器

让bgraToRgbConverter=vImageConverter\u用cgimageformat创建(
&bgraSourceFormat,
&bgrDestinationFormat,
无
vImage_标志(kvImagePrintDiagnosticsToConsole),
无
)
让converter=bgraToRgbConverter!。takeRetainedValue()
现在我们需要从现有的像素数据创建一个读缓冲区,并创建一个写缓冲区来复制我们需要的内容。要从CVPixelBuffer创建读取缓冲区,我们可以执行以下操作:

var bgraBuffer=vImage_Buffer()
让imageFormat=vImageCVImageFormat_使用cvPixelBuffer(cvPixelBuffer)创建
vImageCVImageFormat_SetColorSpace(imageFormat,CGColorSpaceCreateDeviceRGB())
vImageBuffer_InitWithCVPixelBuffer(
&布拉布弗,
&bgraSourceFormat,
像素缓冲区,
图像格式,
无
vImage_标志(kvImageNoFlags)
)
并创建空的写入缓冲区

var bgrBuffer=vImage_Buffer()
vImageBuffer_Init(
&bgrBuffer,
bgraBuffer.height,
bgraBuffer.width,
bgrDestinationFormat.bitsPerPixel,
vImage_标志(kvImageNoFlags)
)
我们准备好了。。。让我们告诉加速框架从一种格式转换到另一种格式

vImageConvert\u AnyToAny(
转换器,
&布拉布弗,
&bgrBuffer,
无
vImage_标志(kvImagePrintDiagnosticsToConsole)
)
就这些。您的BGRA现在作为
vImage\u缓冲区转换为BGR
。我们可以通过直接读取像素数据来检查我们是否完成了我们想要的。首先,我们需要访问数据:

让bgraData=bgraBuffer.data!。assumingMemoryBound(到:UInt8.self)
让bgrData=bgrBuffer.data!。assumingMemoryBound(到:UInt8.self)
现在,我们可以打印第一个和第二个像素

打印(bgraData[0]、bgraData[1]、bgraData[2]、bgraData[3])
打印(bgrData[0]、bgrData[1]、bgrData[2])
打印(bgraData[4]、bgraData[5]、bgraData[6]、bgraData[7])
打印(bgrData[3]、bgrData[4]、bgrData[5])
这是我在操场测试中使用的png图像的输出:

249 244 234 255
249 244 234

251 242 233 255
251 242 233
如您所见,像素是在没有alpha通道的情况下复制的。如果要使用任何for循环,请小心,因为我们现在有3个通道

如果您正在开发一款游戏,并且在每一帧上都执行此操作,请尝试让您的对象保持活动状态。加速格式定义,写入缓冲区和转换器不会因相同的图像大小+格式而改变,因此它们可以创建一次并保存在内存中以备将来使用。

看起来您正在返回一个数据对象。您可以将
unsafemeutablepointer
构造转换为所需的任何内容

或者您也可以使用accelerate的
vImageBuffer\u CopyToCpixelBuffer
方法将
vImageBuffer
转换回CVPixelBuffer(如果需要)
vImage_Buffer
有很多转换器,其中一个肯定能满足您的需要。查看有关如何使用“复制到像素缓冲区”方法的更多信息。在用法上有一个很好的例子

编辑:您的CVPixelBuffer可能已填充

由于硬件要求,您的图像可能有一个填充,以确保缓冲区宽度和高度是16的倍数。这还会导致
vImage\u缓冲区中出现填充。如果需要循环,但只需要访问/更新单个像素,可以使用Accelerate的函数来提高速度。检查一下可能的方法,在这一页的末尾有很多很好的例子

要完全读取数据,可以编写如下内容:

var bgrData=bgrBuffer.data!。assumingMemoryBound(到:UInt8.self)
打印(bgrBuffer.width、bgrBuffer.height、bgrBuffer.rowBytes)
对于uu0..

这将确保您读取的是全宽像素,但在最后通过填充。

Hmm好的,我认为alpha通道字节是一个
249 244 234 255
249 244 234

251 242 233 255
251 242 233