gpt4 book ai didi

iOS - 将 UIImage 转换为 vImage 内存处理

转载 作者:可可西里 更新时间:2023-11-01 05:35:21 25 4
gpt4 key购买 nike

我有一个函数,可以将 UIImage 转换为 vImage(用于 iOS 的 Accelerate 中的一些 vImage 方法.框架

我的方法是:

-(vImage_Buffer)convertImage:(UIImage *)image {
CGImageRef sourceRef = [image CGImage];
NSUInteger sourceWidth = CGImageGetWidth(sourceRef);
NSUInteger sourceHeight = CGImageGetHeight(sourceRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *sourceData = (unsigned char*)calloc(sourceHeight * sourceWidth * 4, sizeof(unsigned char));
NSUInteger bytesPerPixel = 4;
NSUInteger sourceBytesPerRow = bytesPerPixel * sourceWidth;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(sourceData, sourceWidth, sourceHeight,
bitsPerComponent, sourceBytesPerRow, colorSpace,
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, sourceWidth, sourceHeight), sourceRef);
CGContextRelease(context);
vImage_Buffer v_image = {
.data = sourceData,
.height = sourceHeight,
.width = sourceWidth,
.rowBytes = sourceBytesPerRow
};

return v_image;
}

我通过混合和匹配网络上的一些代码片段来构建它。

我的问题是,我有一个 calloc 调用,它为 sourceData 分配空间。但是我应该如何以及在哪里释放这些内存呢?

考虑到我可能多次调用此方法,看起来按原样,会出现巨大的内存泄漏。我不认为我会在这里发布它,因为它为我的 vImage_Buffer 变量提供支持 .data。但是我会在我的调用函数中释放它吗?或者将 v_image 设置为 nil(或在调用方法中命名的任何返回变量)最终释放由 分配的内存calloc 行?

有没有人有任何指点?

最佳答案

首先你还需要通过调用CGColorSpaceRelease(colorSpace)释放colorSpace

calloc 分配的内存稍后可以在使用 free(v_image.data) 的调用函数中释放(或调用方法中返回的任何命名变量)。

您还可以更改您的方法实现以摆脱 CGContext 并使用 CGDataProviderRefCGImage 获取字节,它类似于:

-(vImage_Buffer)convertImage:(UIImage *)image
{
CGImageRef sourceRef = [image CGImage];
NSUInteger sourceWidth = CGImageGetWidth(sourceRef);
NSUInteger sourceHeight = CGImageGetHeight(sourceRef);

CGDataProviderRef provider = CGImageGetDataProvider(sourceRef);
CFDataRef bitmapData = CGDataProviderCopyData(provider);

unsigned char *sourceData = (unsigned char*)calloc(sourceHeight * sourceWidth * 4, sizeof(unsigned char));
NSUInteger bytesPerPixel = 4;
NSUInteger sourceBytesPerRow = bytesPerPixel * sourceWidth;

CFDataGetBytes(bitmapData, CFRangeMake(0, CFDataGetLength(bitmapData)), sourceData);

vImage_Buffer v_image = {
.data = (void *)sourceData,
.height = sourceHeight,
.width = sourceWidth,
.rowBytes = sourceBytesPerRow
};

CFRelease(bitmapData);

return v_image;
}

但是我没有检查性能。

我还建议将您的方法重命名为类似 vImageCreateFromImage 的名称。你会意识到稍后你负责清理内存。

关于iOS - 将 UIImage 转换为 vImage 内存处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22881875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com