gpt4 book ai didi

objective-c - 核心显卡0x1​​04567911

转载 作者:行者123 更新时间:2023-12-03 17:52:19 26 4
gpt4 key购买 nike

我有一个绘制图像的类。对于多个图像源,它被实例化多次,并且可以一次拥有多个这样的对象;每个都获取中断驱动的提要(来自 USB 设备)。

该类的部分功能是对输入的图像进行注释,因此有一个例程可以执行一些标准 Core Graphics 的操作来添加注释。

我通过位图上下文来完成此操作,首先在其中绘制图像,然后使用标准 CGContext 内容向其添加注释。

问题是,当我这样做时,来自多个来源的图像会相互重叠。它看起来像是一个既定的上下文;即使位图上下文也不是线程安全的。不过我加了NSLock,并没有解决问题,所以可能不仅仅是线程安全的问题。

这是该例程的简化版本:

- (CGImageRef)createCopiedImage:(CGImageRef)inImage
{
CGImageRef ret = nil;

CGRect imageRect = CGRectMake ( 0, 0, CGImageGetWidth ( ret ), CGImageGetHeight ( ret ) );
size_t rowBytes = imageRect.size.width * 4;
size_t bufferLen = rowBytes * imageRect.size.height;
void *buffer = malloc ( bufferLen );

if ( buffer )
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName ( kCGColorSpaceGenericRGB );

if ( colorSpace )
{
CGContextRef drawingContext = CGBitmapContextCreate ( buffer, imageRect.size.width, imageRect.size.height, 8, rowBytes, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst );

if ( drawingContext )
{
CGContextDrawImage ( drawingContext, imageRect, inImage );

CFRelease ( backGroundImage );


// DO ANNOTATION STUFF HERE

CGDataProviderRef dataProvider = CGDataProviderCreateWithData ( NULL, buffer, rowBytes * imageRect.size.height, NULL );

if ( dataProvider )
{
CGImageRef ret = CGImageCreate ( imageRect.size.width, imageRect.size.height, 8, 32, rowBytes, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst, dataProvider, NULL, false, kCGRenderingIntentDefault );

CGDataProviderRelease ( dataProvider) ;
}

CGContextRelease ( drawingContext );
}

free ( buffer );
}

return ret;
}

关于如何避免这些实例互相踩踏有什么想法吗?

最佳答案

尽管存在内存泄漏,您应该能够让系统为您处理内存分配,并仅使用新创建的绘图来复制 CGImageRef:

@implementation YourClass

- (CGImageRef)createCopiedImage:(CGImageRef)inImage
{
CGImageRef ret = NULL;

CGRect imageRect = CGRectMake ( 0, 0, CGImageGetWidth ( ret ), CGImageGetHeight ( ret ) );
size_t rowBytes = imageRect.size.width * 4;
size_t bufferLen = rowBytes * imageRect.size.height;

CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName ( kCGColorSpaceGenericRGB );

if ( colorSpace )
{
CGContextRef drawingContext = CGBitmapContextCreate ( NULL, imageRect.size.width, imageRect.size.height, 8, rowBytes, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst );

if ( drawingContext )
{
CGContextDrawImage ( drawingContext, imageRect, inImage );

CFRelease ( backGroundImage );

// DO ANNOTATION STUFF HERE

// Copy image out
ret = CGBitmapContextCreateImage(drawingContext);

CGContextRelease ( drawingContext );
}
}

return ret;
}

@end

关于objective-c - 核心显卡0x1​​04567911,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22812862/

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